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