두 조각은 서로 다른 일을하기 때문에 취향의 문제가 아니라 상황에서 올바른 행동이 무엇인지의 문제입니다. 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
Bar 클래스에 바인딩 됩니다 . 변경 사항이 전파됩니다!
>>> bar1 = Bar()
>>> bar2 = Bar()
>>> bar1.num = 2
>>> bar2.num
1
>>> Bar.num = 3
>>> bar2.num
3
>>> bar1.num
2
>>> bar1.__class__.num
3
실제 답변
클래스 변수가 필요하지 않고 인스턴스 변수에 대한 기본값 만 설정하면되는 경우 두 메서드 모두 똑같이 좋은가요? 아니면 그들 중 하나가 다른 것보다 더 '비단뱀 적'입니까?
전시회 B의 코드는 이것에 대해 명백히 잘못되었습니다. 클래스 속성 (인스턴스 생성시 기본값)을 단일 인스턴스에 바인딩하려는 이유는 무엇입니까?
전시회 A의 코드는 괜찮습니다.
생성자에서 인스턴스 변수에 대한 기본값을 제공하려면 다음을 수행합니다.
class Foo:
def __init__(self, num = None):
self.num = num if num is not None else 1
...또는:
class Foo:
DEFAULT_NUM = 1
def __init__(self, num = None):
self.num = num if num is not None else DEFAULT_NUM
... 또는 심지어 : (바람직하지만 불변 유형을 다루는 경우에만!)
class Foo:
def __init__(self, num = 1):
self.num = num
이렇게하면 다음을 수행 할 수 있습니다.
foo1 = Foo(4)
foo2 = Foo()
self.attr = attr or []
내에서 작성 하십시오__init__
. 동일한 결과를 얻었으며 (내 생각에) 여전히 명확하고 읽기 쉽습니다.