Два фрагмента делают разные вещи, так что дело не в вкусе, а в том, как правильно вести себя в вашем контексте. Документация Python объясняет разницу, но вот несколько примеров:
Приложение A
class Foo:
def __init__(self):
self.num = 1
Это связывает num
с экземплярами Foo ,Изменение в этом поле не распространяется на другие экземпляры.
Таким образом:
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.num = 2
>>> foo2.num
1
Приложение B
class Bar:
num = 1
Это связывает num
с баром класс .Изменения распространяются!
>>> bar1 = Bar()
>>> bar2 = Bar()
>>> bar1.num = 2 #this creates an INSTANCE variable that HIDES the propagation
>>> bar2.num
1
>>> Bar.num = 3
>>> bar2.num
3
>>> bar1.num
2
>>> bar1.__class__.num
3
Фактический ответ
Если мне не требуется переменная класса, а нужно только установить значение по умолчанию для переменных моего экземпляра, оба метода одинаковохорошо?Или один из них более «питонический», чем другой?
Код в экспонате B совершенно неверен для этого: зачем вам связывать атрибут класса (значение по умолчанию при создании экземпляра) содин экземпляр?
Код в приложении A в порядке.
Если вы хотите задать значения по умолчанию для переменных экземпляра в вашем конструкторе, я бы сделал это:
class Foo:
def __init__(num = None):
self.num = num if num is not None else 1
... или даже:
class Foo:
DEFAULT_NUM = 1
def __init__(num = None):
self.num = num if num is not None else DEFAULT_NUM
... или даже: (предпочтительно, но если и только если вы имеете дело с неизменяемыми типами!)
class Foo:
def __init__(num = 1):
self.num = num
Таким образом, вы можетеделать:
foo1 = Foo(4)
foo2 = Foo() #use default