Форум сайта python.su
0
Добрый день.
У меня есть 3 класса, каждый из которых считает свой тип кривой : Пирсон, Сплайны и Безье. Для каждого из них нужно посчитать адекватность. В данный момент каждый класс кривых содержит следующую копи-пасту:
def calculate_adequacy_person(self): chi, phi_2 = chisquare(self.p_nabl, f_exp=self.p_teor) self.adequacy_person = f'\chi^2_кр = {phi_2} \n\chi^2_эмп = {chi} ' def calculate_adequacy_kolmagorov(self): stats = ks_2samp(self.p_teor, self.p_nabl) self.adequacy_kolmagorov = f'K_\\alpha = {stats[0]} \n\\alpha = {stats[1]} ' def calculate_adequacy_kendal(self): kendal = spstat.stats.kendalltau(self.p_teor, self.p_nabl) self.adequacy_kendal = f'\\tau = {kendal[0]:4} \n p = {kendal[1]*2:4} ' def calculate_teor_data(self): self.p_teor = self.x__.copy() self.p_nabl = self.probability_rand_value.copy() for i, item in enumerate(self.x__): self.p_teor[i] = self.function(item)
Офлайн
294
druidich92абстрактный класс создать где все эти четыре метода описать, и от него отнаследовать все остальные: Пирсон, Сплайны и Безье.
Собственно вопрос, как красиво решить проблему повторяющегося кода ?
[code python][/code]
Отредактировано PEHDOM (Окт. 4, 2017 12:31:32)
Офлайн
186
> абстрактный класс создать где все эти четыре метода описать
Вот только создавать нужно не абстрактный, а базовый класс.
Офлайн
294
Rodegastхрен с ним , пускай будет базовый.. всеже в абстрактном классе предполагаеться наличие абстрактных же методов, а нам нужно вполне конкретные методы что в абстракном классе западло
Вот только создавать нужно не абстрактный, а базовый класс.
[code python][/code]
Офлайн
0
PEHDOMя правильно понимаю, что получается что то на подобии
from scipy.stats import chisquare, ks_2samp
import scipy.stats as spstat
class Adequacy:
'''
Класс, расчитывающий критерии адекватности
'''
def calculate_adequacy_all(self):
self.calculate_adequacy_person()
self.calculate_adequacy_kolmagorov()
self.calculate_adequacy_kendal()
def calculate_adequacy_person(self):
chi, phi_2 = chisquare(self.p_nabl, f_exp=self.p_teor)
self.adequacy_person = f'\chi^2_кр = {phi_2} \n\chi^2_эмп = {chi} '
def calculate_adequacy_kolmagorov(self):
stats = ks_2samp(self.p_teor, self.p_nabl)
self.adequacy_kolmagorov = f'K_\\alpha = {stats[0]} \n\\alpha = {stats[1]} '
def calculate_adequacy_kendal(self):
kendal = spstat.stats.kendalltau(self.p_teor, self.p_nabl)
self.adequacy_kendal = f'\\tau = {kendal[0]:4} \n p = {kendal[1]*2:4} '
def calculate_teor_data(self):
self.p_teor = self.x__.copy()
self.p_nabl = self.probability_rand_value.copy()
for i, item in enumerate(self.x__):
self.p_teor[i] = self.function(item)
Офлайн
294
druidich92скорее чтото типа:
я правильно понимаю, что получается что то на подобии
class BaseCurve: ''' Базовый класс для всех кривых ''' .... def calculate_adequacy_all(self): self.calculate_adequacy_person() self.calculate_adequacy_kolmagorov() self.calculate_adequacy_kendal() def calculate_adequacy_person(self): .... def calculate_adequacy_kolmagorov(self): .... class PirsonCurve(BaseCurve): ''' Класс реализующий кривую Пирсона ''' .....
[code python][/code]
Отредактировано PEHDOM (Окт. 4, 2017 13:39:07)
Офлайн
857
Наследования нужно избегать. Вместо него используют агрегацию, так как она не связывает код.
Так что надо в классах тех работать с интерфейсами. А после того, как оно написано, нужно написать такие классы, которые реализуют эти интерфейсы. И когда они сделаны, надо сделать агрегацию - то есть сделать экземпляры этих реализаций и подать эти экземпляры снаружи через конструктор.
>>> class A: ... ... def __init__(self, icalc): ... self.calc = icalc ... ... def calc_formula1(self): ... return self.calc.count1(1, 2, 3) ... ... def calc_formula2(self): ... return self.calc.count2(4, 5, 6) ... ... def calc_formula3(self): ... return self.calc.count3(7, 8, 9) ... >>> class Calc: ... ... def count1(self, a, b, c): ... return a + b + c ... ... def count2(self, a, b, c): ... return 2 * a + 2 * b + 2 * c ... ... def count3(self, a, b, c): ... return 3 * a + 3 * b + 3 * c ... >>> a = A(Calc()) >>> a.calc_formula1() 6 >>> a.calc_formula2() 30 >>> a.calc_formula3() 72 >>>
Офлайн
568
py.user.nextОчередная лопата бреда?
Наследования нужно избегать.
Офлайн
857
FishHookНаследования избегают, потому что в рантайме его невозможно изменить.
Очередная лопата бреда?
Офлайн
186
> Наследования избегают, потому что в рантайме его невозможно изменить.
Если тебе приходится в рантайме менять базовый класс, то у тебя явные проблемы с архитектурой.
Офлайн