Программирование на Python и OO (атрибуты класса и производные классы) - PullRequest
2 голосов
/ 21 января 2011

Я программист на Java в течение 4,5 лет. Теперь я перешел на Python (и главная причина в том, что я теперь фрилансер и работаю один). Я предоставляю исходный код своим клиентам, и иногда мне приходится мотивировать свой выбор дизайна. Теперь к вопросу. Я должен поддержать мой выбор дизайна:

class Base(object):
    def foo(self):
        self.dosomethig(self.clsattr1)
        self.dosomethig(self.clsattr2)

class Derived(Base):
    clsattr1 = value1
    clsattr2 = value2

Базовый класс всегда предназначен для расширения или получения.
Мой клиент (Java-программист) утверждает, что мой подход не элегантен с точки зрения ОО. Он утверждает, что следующий подход лучше:

class Base(object):
    def __init__(self, clsattr1, clsattr2):
        self.clsattr1 = clsattr1
        self.clsattr2 = clsattr2

    def foo(self):
        self.dosomethig(self.clsattr1)
        self.dosomethig(self.clsattr2)

class Derived(Base):
    def __init__(self):
        super(Derived, self).__init__(value1, value2)

Я понимаю, что второй подход гораздо более элегантен, чем первый, но я сказал ему, что Первый подход гораздо удобнее. Я сказал ему, что не вижу никаких проблем, но он не убежден. Первый подход такой плохой? И почему?

Ответы [ 3 ]

3 голосов
/ 21 января 2011

Кажется, нет никакой разницы. Не тратьте свое время на споры с ним - это может быть быстрее, просто провести рефакторинг своих классов и взять деньги.

0 голосов
/ 21 января 2011

Если класс Base требует, чтобы значения делали свое дело, то он должен быть явным.

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

Самое интересное различие между примерами состоит в том, что первый фрагмент кода пытается использовать переменные класса базового класса, которые влияют на каждый производный класс и все его экземпляры. Каким образом это должно быть? Значения в иерархии? За производный класс? За экземпляр?

В лучшем питоническом стиле, если объекты могут устанавливать свои собственные значения инициализации, класс Base должен использовать для них разумные значения по умолчанию и предоставлять механизм для подклассов и их экземпляров для их переопределения.

class Base(object):
    def __init__(self, attr1=DEFAULT1, attr2=DEFAULT2):
        self.attr1 = attr1
        self.attr2 = attr2
0 голосов
/ 21 января 2011

Второй фрагмент можно назвать «элегантным» только по сравнению с Java.Мало того, что он почти вдвое длиннее, использование переменных __ является явным признаком того, что программист борется с языком, и существует множество возможных ошибок.хочешь Java, ты знаешь где его найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...