Самый «питонный» способ организации атрибутов класса, аргументов конструктора и значений по умолчанию конструктора подкласса?

Будучи относительно новым для Python 2, я не уверен, как лучше организовать файлы моих классов в наиболее «pythonic». путь. Я бы не спрашивал об этом, но из-за того факта, что Python, кажется, имеет довольно много способов делать вещи, которые сильно отличаются от того, что я привык ожидать от языков, к которым я привык.

Первоначально я просто относился к классам так, как я обычно отношусь к ним на C # или PHP, что, конечно, заставило меня запутаться повсюду, когда я в конечном итоге обнаружил изменяемые значения gotcha:

class Pants(object):
    pockets = 2
    pocketcontents = []

class CargoPants(Pants):
    pockets = 200

p1 = Pants()
p1.pocketcontents.append("Magical ten dollar bill")
p2 = CargoPants()

print p2.pocketcontents

Хлоп! Не ожидал этого!

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

Поработав так в течение некоторого времени, я все еще немного почесал голову из-за незнакомства с этим. Учитывая длину, с которой язык Python делает вещи более интуитивными и очевидными, для меня это кажется совершенно странным в тех немногих случаях, когда у меня довольно много атрибутов или много аргументов конструктора по умолчанию, особенно когда я ; m подклассы:

class ClassWithLotsOfAttributes(object):
    def __init__(self, jeebus, coolness='lots', python='isgoodfun', 
             pythonic='nebulous', duck='goose', pants=None, 
             magictenbucks=4, datawad=None, dataload=None,
             datacatastrophe=None):

        if pants is None: pants = []
        if datawad is None: datawad = []
        if dataload is None: dataload = []
        if datacatastrophe is None: datacatastrophe = []
        self.coolness = coolness
        self.python = python
        self.pythonic = pythonic
        self.duck = duck
        self.pants = pants
        self.magictenbucks = magictenbucks
        self.datawad = datawad
        self.dataload = dataload
        self.datacatastrophe = datacatastrophe
        self.bigness = None
        self.awesomeitude = None
        self.genius = None
        self.fatness = None
        self.topwise = None
        self.brillant = False
        self.strangenessfactor = 3
        self.noisiness = 12
        self.whatever = None
        self.yougettheidea = True

class Dog(ClassWithLotsOfAttributes):
    def __init__(self, coolness='lots', python='isgoodfun', pythonic='nebulous', duck='goose', pants=None, magictenbucks=4, datawad=None, dataload=None, datacatastrophe=None):
        super(ClassWithLotsOfAttributes, self).__init__(coolness, python, pythonic, duck, pants, magictenbucks, datawad, dataload, datacatastrophe)
        self.noisiness = 1000000

    def quack(self):
        print "woof"

Не говоря уже о легкой глупости (я действительно не могу помочь себе, когда готовлю эти искусственные классы), предполагая, что у меня есть реальная потребность в наборе классов с таким количеством атрибутов, я полагаю, что мои вопросы:

What is the most, uhh, 'pythonic' way of declaring a class with that many attributes? Is it best to put them against the class if the default is immutable, ala Pants.pockets, or is it better to put them in the constructor, ala ClassWithLotsOfAttributes.noisiness?

Is there a way to eliminate the need to redeclare the defaults for all of the subclass constructor arguments, as in Dog.__init__? Should I even be including this many arguments with defaults anyway?

Ответы на вопрос(2)

Ваш ответ на вопрос