Python의 "property"와 "attribute"의 차이점은 무엇입니까?
나는 일반적으로 '속성'과 '속성'의 차이에 대해 혼란스러워하고 있으며, 그 차이를 간결하게 설명할 수 있는 훌륭한 자원을 찾을 수 없다.
속성은 특별한 종류의 속성입니다.기본적으로 Python이 다음 코드를 발견했을 때:
spam = SomeObject()
print(spam.eggs)
위를 보다eggs에spam를 검사합니다.eggs가 있는지 확인하다__get__,__set__, 또는__delete__method: 있는 경우 속성입니다.만약 그것이 재산이라면, 단지 반환하는 것이 아니라eggs오브젝트(다른 Atribute와 마찬가지로)를 호출합니다.__get__method(조회 중이었으므로) 및 그 메서드가 반환하는 모든 것을 반환합니다.
Python의 데이터 모델 및 설명자에 대한 자세한 정보.
속성을 사용하면 getter, setter 및 deleter 메서드를 완전히 제어할 수 있습니다.이 메서드에는 (경고를 사용하지 않는 경우) 속성이 없습니다.
class A(object):
_x = 0
'''A._x is an attribute'''
@property
def x(self):
'''
A.x is a property
This is the getter method
'''
return self._x
@x.setter
def x(self, value):
"""
This is the setter method
where I can check it's not assigned a value < 0
"""
if value < 0:
raise ValueError("Must be >= 0")
self._x = value
>>> a = A()
>>> a._x = -1
>>> a.x = -1
Traceback (most recent call last):
File "ex.py", line 15, in <module>
a.x = -1
File "ex.py", line 9, in x
raise ValueError("Must be >= 0")
ValueError: Must be >= 0
일반적으로 속성과 속성은 같은 것입니다.그러나 Python에는 속성(또는 기타 데이터)에 대한 getter/setter 액세스를 제공하는 속성 데코레이터가 있습니다.
class MyObject(object):
# This is a normal attribute
foo = 1
@property
def bar(self):
return self.foo
@bar.setter
def bar(self, value):
self.foo = value
obj = MyObject()
assert obj.foo == 1
assert obj.bar == obj.foo
obj.bar = 2
assert obj.foo == 2
assert obj.bar == obj.foo
이 속성을 사용하면 일반 애트리뷰트와 마찬가지로 값을 가져오고 설정할 수 있지만, 그 아래에는 getter 및 setter로 변환하는 메서드가 있습니다.콜게터나 셋터의 보일러 플레이트를 줄이는 것은 정말 편리합니다.
예를 들어, 필요한 것에 대해 x와 y 좌표를 갖는 클래스가 있다고 가정해 보겠습니다.이러한 설정을 실시하려면 , 다음과 같은 조작을 실시할 수 있습니다.
myObj.x = 5
myObj.y = 10
이는 글을 쓰는 것보다 훨씬 쉽게 보고 생각할 수 있습니다.
myObj.setX(5)
myObj.setY(10)
문제는 만약 어느 날 당신의 클래스가 바뀌어서 당신의 x와 y를 어떤 값만큼 상쇄해야 한다면 어떻게 할 것인가 하는 것입니다.이제 클래스 정의와 클래스 정의를 호출하는 모든 코드를 변경해야 합니다. 이 작업은 시간이 많이 걸리고 오류가 발생하기 쉽습니다.속성을 사용하면 이전 구문을 사용하면서도 후자의 변경에 대한 유연성을 얻을 수 있습니다.
Python에서는 속성 함수를 사용하여 getters, setters 및 delete 메서드를 정의할 수 있습니다.읽기 속성을 원하는 경우 메서드 위에 추가할 수 있는 @property 데코레이터도 있습니다.
http://docs.python.org/library/functions.html#property
나는 Bernd Klein 사이트에서 요약해서 두 가지 차이점을 배웠다.
1. 속성은 데이터 캡슐화를 실현하는 보다 편리한 방법입니다.
인 속성'이 해 보겠습니다length나중에 프로젝트에서는 캡슐화를 요구합니다.즉, 프라이빗으로 변경하고 getter와 setter를 제공하려면 이전에 작성한 코드를 변경해야 합니다.
# Old code
obj1.length = obj1.length + obj2.length
# New code (using private attributes and getter and setter)
obj1.set_length(obj1.get_length() + obj2.get_length()) # => this is ugly
「 」를 사용하고 @property ★★★★★★★★★★★★★★★★★」@length.setter=> 오래된 코드는 변경할 필요가 없습니다.
2. 속성은 여러 속성을 캡슐화할 수 있습니다.
class Person:
def __init__(self, name, physic_health, mental_health):
self.name = name
self.__physic_health = physic_health
self.__mental_health = mental_health
@property
def condition(self):
health = self.__physic_health + self.__mental_health
if(health < 5.0):
return "I feel bad!"
elif health < 8.0:
return "I am ok!"
else:
return "Great!"
예에서는 " " 입니다.__physic_health ★★★★★★★★★★★★★★★★★」__mental_health은 비공개이며 외부에서 직접 액세스할 수 없습니다.
또한 데이터를 캐시하거나 새로 고칠 때 사용하는 명백한 차이점이 하나 있는데, 종종 클래스 속성에 연결된 함수가 있습니다.예를 들어 파일을 한 번 읽고 Atribute에 할당된 콘텐츠를 유지하여 값이 캐시되도록 해야 합니다.
class Misc():
def __init__(self):
self.test = self.test_func()
def test_func(self):
print 'func running'
return 'func value'
cl = Misc()
print cl.test
print cl.test
출력:
func running
func value
func value
속성에 두 번 액세스했지만 기능이 한 번만 실행되었습니다.속성을 사용하도록 위의 예를 변경하면 속성에 액세스할 때마다 속성의 값이 새로 고쳐집니다.
class Misc():
@property
def test(self):
print 'func running'
return 'func value'
cl = Misc()
print cl.test
print cl.test
출력:
func running
func value
func running
func value
속성에 대한 제한을 설정하려면 속성을 사용하는 것이 좋습니다.
Public이지만 Atribute를 Public Atribute Private Atribute)로합니다._하십시오. 하다
class A:
def __init__(self):
self.b = 3 # To show public
self._c = 4 # To show private
서서,,bAtribute는 외부 클래스A에서 액세스 하는 것을 목적으로 하고 있습니다.이 ', '이러다', '이러다', '이러다', '이러다', '이러다', '이러다', '이러다',b class에서 합니다.A
「 」를하지 않을 경우b 이 를 알 수요.@property.
class A:
def __init__(self):
self._c = 4 # To show private
@property
def b(self):
return 3
그럼 이제 ㅇㅇㅇㄹㄹㄹㄹ,b설정할 수 없습니다.
a = A()
print(a.b) # prints 3
a.b = 7 # Raises AttributeError
또는 특정 값만 설정하려면
class A:
@property
def b(self):
return self._b
@b.setter
def b(self, val):
if val < 0:
raise ValueError("b can't be negative")
self._b = val
a = A()
a.b = 6 # OK
a.b = -5 # Raises ValueError
언급URL : https://stackoverflow.com/questions/7374748/whats-the-difference-between-a-python-property-and-attribute
'programing' 카테고리의 다른 글
| 같은 스레드에서 시작 메서드를 두 번 호출하는 것이 합법입니까? (0) | 2022.09.28 |
|---|---|
| 존재하지 않는 참조를 사용하여 MariaDB에 데이터 저장 (0) | 2022.09.28 |
| VueJS 동적 속성 이름이 값을 업데이트하지 않음 (0) | 2022.09.28 |
| 어떻게 파이선 module/package 쓸? (0) | 2022.09.28 |
| 위도와 경도를 얼마나 정확하게 저장해야 합니까? (0) | 2022.09.27 |