반응형
파이썬에서 클래스 변수를 정의하는 올바른 방법
가능한 중복 :
클래스 __init __ () 함수 내부 및 외부의 변수
파이썬에서 사람들은 두 가지 다른 방식으로 클래스 속성을 초기화합니다.
첫 번째 방법은 다음과 같습니다.
class MyClass:
__element1 = 123
__element2 = "this is Africa"
def __init__(self):
#pass or something else
다른 스타일은 다음과 같습니다.
class MyClass:
def __init__(self):
self.__element1 = 123
self.__element2 = "this is Africa"
클래스 속성을 초기화하는 올바른 방법은 무엇입니까?
어느 쪽도 반드시 정확하거나 부정확하지는 않으며 두 가지 종류의 클래스 요소 일뿐입니다.
__init__
메소드 외부의 요소 는 정적 요소입니다. 그들은 수업에 속합니다.__init__
메소드 내부의 요소는 객체의 요소입니다 (self
). 그들은 수업에 속하지 않습니다.
몇 가지 코드로 더 명확하게 볼 수 있습니다.
class MyClass:
static_elem = 123
def __init__(self):
self.object_elem = 456
c1 = MyClass()
c2 = MyClass()
# Initial values of both elements
>>> print c1.static_elem, c1.object_elem
123 456
>>> print c2.static_elem, c2.object_elem
123 456
# Nothing new so far ...
# Let's try changing the static element
MyClass.static_elem = 999
>>> print c1.static_elem, c1.object_elem
999 456
>>> print c2.static_elem, c2.object_elem
999 456
# Now, let's try changing the object element
c1.object_elem = 888
>>> print c1.static_elem, c1.object_elem
999 888
>>> print c2.static_elem, c2.object_elem
999 456
보시다시피 클래스 요소를 변경하면 두 개체 모두에 대해 변경되었습니다. 그러나 객체 요소를 변경해도 다른 객체는 변경되지 않았습니다.
이 샘플은 스타일의 차이점을 설명합니다.
james@bodacious-wired:~$cat test.py
#!/usr/bin/env python
class MyClass:
element1 = "Hello"
def __init__(self):
self.element2 = "World"
obj = MyClass()
print dir(MyClass)
print "--"
print dir(obj)
print "--"
print obj.element1
print obj.element2
print MyClass.element1 + " " + MyClass.element2
james@bodacious-wired:~$./test.py
['__doc__', '__init__', '__module__', 'element1']
--
['__doc__', '__init__', '__module__', 'element1', 'element2']
--
Hello World
Hello
Traceback (most recent call last):
File "./test.py", line 17, in <module>
print MyClass.element2
AttributeError: class MyClass has no attribute 'element2'
element1은 클래스에 바인딩되고 element2는 클래스의 인스턴스에 바인딩됩니다.
참고 URL : https://stackoverflow.com/questions/9056957/correct-way-to-define-class-variables-in-python
반응형
'IT story' 카테고리의 다른 글
여러 클래스에 스타일을 한 번에 적용하려면 어떻게해야합니까? (0) | 2020.04.19 |
---|---|
Eclipse 전체 행 키보드 단축키 복사 / 붙여 넣기 (0) | 2020.04.19 |
세마포어 대 모니터-차이점은 무엇입니까? (0) | 2020.04.19 |
애니메이션을 중지하는 방법 (cancel ()이 작동하지 않음) (0) | 2020.04.19 |
Get-ChildItem을 사용하여 디렉토리 만 가져 오려면 어떻게합니까? (0) | 2020.04.19 |