Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 4, 2017 12:20:35

druidich92
Зарегистрирован: 2016-03-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Общие методы для группы классов

Добрый день.
У меня есть 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)

Собственно вопрос, как красиво решить проблему повторяющегося кода ?
думаю создать модуль с функциями, но мне не нравится тот факт что придется много данных передавать в качестве входных данных (большой массив входных точек)

Офлайн

#2 Окт. 4, 2017 12:26:10

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Общие методы для группы классов

druidich92
Собственно вопрос, как красиво решить проблему повторяющегося кода ?
абстрактный класс создать где все эти четыре метода описать, и от него отнаследовать все остальные: Пирсон, Сплайны и Безье.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Окт. 4, 2017 12:31:32)

Офлайн

#3 Окт. 4, 2017 12:48:38

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2842
Репутация: +  186  -
Профиль   Отправить e-mail  

Общие методы для группы классов

> абстрактный класс создать где все эти четыре метода описать

Вот только создавать нужно не абстрактный, а базовый класс.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Окт. 4, 2017 13:25:37

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Общие методы для группы классов

Rodegast
Вот только создавать нужно не абстрактный, а базовый класс.
хрен с ним , пускай будет базовый.. всеже в абстрактном классе предполагаеться наличие абстрактных же методов, а нам нужно вполне конкретные методы что в абстракном классе западло



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#5 Окт. 4, 2017 13:27:27

druidich92
Зарегистрирован: 2016-03-05
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Общие методы для группы классов

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)

Офлайн

#6 Окт. 4, 2017 13:32:02

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Общие методы для группы классов

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):
    '''
    Класс реализующий кривую Пирсона
    '''
    .....
Но в приницпе верной дорогой идете товарищ
и я бы описал в базовом классе все атрибуты типа p_nabl p_teor и тд, чтобы потом не запутаться.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Окт. 4, 2017 13:39:07)

Офлайн

#7 Окт. 4, 2017 13:47:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Общие методы для группы классов

Наследования нужно избегать. Вместо него используют агрегацию, так как она не связывает код.
Так что надо в классах тех работать с интерфейсами. А после того, как оно написано, нужно написать такие классы, которые реализуют эти интерфейсы. И когда они сделаны, надо сделать агрегацию - то есть сделать экземпляры этих реализаций и подать эти экземпляры снаружи через конструктор.

  
>>> 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
>>>



Офлайн

#8 Окт. 4, 2017 14:14:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Общие методы для группы классов

py.user.next
Наследования нужно избегать.
Очередная лопата бреда?



Офлайн

#9 Окт. 4, 2017 14:19:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Общие методы для группы классов

FishHook
Очередная лопата бреда?
Наследования избегают, потому что в рантайме его невозможно изменить.



Офлайн

#10 Окт. 4, 2017 14:50:49

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2842
Репутация: +  186  -
Профиль   Отправить e-mail  

Общие методы для группы классов

> Наследования избегают, потому что в рантайме его невозможно изменить.

Если тебе приходится в рантайме менять базовый класс, то у тебя явные проблемы с архитектурой.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version