Я не совсем уверен, что вам не хватает, поэтому позвольте мне затронуть некоторые основные предметы.
В объекте Python class
есть два "специальных" имени инициализации, одно из которых относительно редко беспокоит пользователей, называется __new__
, а другое - гораздо более обычное, называется __init__
. * 1006. *
Когда вы вызываете конструктор объекта класса, например, (на основе вашего примера) x = Game(args)
, это сначала вызывает Game.__new__
, чтобы получить память для хранения объекта, а затем Game.__init__
, чтобы заполнить эту память. В большинстве случаев вы можете позволить базовому object.__new__
выделять память, и вам просто нужно заполнить ее. (Вы можете использовать свой собственный распределитель для особых странных редких случаев, таких как объекты, которые никогда не меняются и могут иметь общие идентификационные данные, как обычные целые числа, например. Это также для "метаклассов", которые делают странные вещи. Но это тема гораздо позже.)
Ваша Game.__init__
функция вызывается со «всеми аргументами конструктора» плюс один, спрятанный впереди, который является памятью, выделенной для самого объекта. (Для «обычных» объектов это в основном словарь «атрибутов», плюс волшебный клей для классов, но для объектов с __slots__
словарь атрибутов опущен.) Присвоение имени первому аргументу self
- это просто соглашение, но не не нарушайте это, люди будут ненавидеть вас, если вы делаете. : -)
Нет ничего, что требовало бы от вас сохранения всех аргументов в конструкторе. Вы можете установить любой или все атрибуты экземпляра, которые вам нравятся:
class Weird(object):
def __init__(self, required_arg1, required_arg2, optional_arg3 = 'spam'):
self.irrelevant = False
def __str__(self):
...
Дело в том, что экземпляр Weird () довольно бесполезен после инициализации, потому что вам необходимо передать два аргумента, которые просто отбрасываются, и дан третий необязательный аргумент, который также отбрасывается:
x = Weird(42, 0.0, 'maybe')
Единственный пункт, требующий, чтобы эти отброшенные аргументы были для будущего расширения, как это было (у вас могли быть эти неиспользуемые поля во время ранней разработки). Так что, если вы не сразу используете и / или не сохраняете аргументы в __init__
, что-то определенно странное в Weird
.
Кстати, единственная причина использования (object)
в определении класса - указать Python 2.x, что это класс "нового стиля" (в отличие от очень старых классов Python "только для экземпляров") , Но, как правило, лучше использовать его - он делает то, что я сказал выше о object.__new__
, например, правда :-) - до Python 3, где все в старом стиле полностью исчезло.