Будучи относительно новым для Python 2, я не уверен, как лучше организовать свои файлы классов самым «питоническим» способом. Я не стал бы спрашивать об этом, кроме того факта, что в Python, похоже, есть довольно много способов сделать то, что сильно отличается от того, что я привык ожидать от языков, к которым я привык.
Изначально я просто относился к классам так, как я обычно относился к ним на C # или PHP, что, конечно, заставило меня запутаться повсюду, когда я в конце концов обнаружил изменяемые значения: - 1003 *
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, чтобы сделать вещи более интуитивными и очевидными, для меня это кажется странным в тех немногих случаях, когда у меня достаточно атрибутов или аргументов конструктора по умолчанию, особенно когда я Подкласс:
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"
Небольшая глупость в стороне (я не могу помочь себе, когда готовлю эти искусственные классы примеров), предполагая, что у меня есть реальная потребность в наборе классов с таким количеством атрибутов, я предполагаю, что мои вопросы:
Какой самый «эмпирический» способ объявления класса с таким количеством атрибутов? Лучше ли помещать их в класс, если значение по умолчанию является неизменяемым, например, Pants.pockets, или лучше поместить их в конструктор, например, ClassWithLotsOfAttributes.noisiness?
Есть ли способ устранить необходимость переопределения значений по умолчанию для всех аргументов конструктора подкласса, как в Dog .__ init__? Должен ли я вообще включать столько аргументов в значения по умолчанию?