나는 일반적으로 “속성”과 “속성”의 차이점에 대해 혼란스러워하며 차이점을 간결하게 자세히 설명 할 수있는 훌륭한 자료를 찾을 수 없습니다.
답변
속성은 특별한 종류의 속성입니다. 기본적으로 Python에서 다음 코드가 발생하면
spam = SomeObject()
print(spam.eggs)
그것은 조회 eggs
에서 spam
, 다음 검사 eggs
그것은이 있는지 __get__
, __set__
또는 __delete__
방법을 – 그것은 않는 경우,이 속성입니다. 이 경우 이다 속성, 대신 복귀의 eggs
개체가 호출 (다른 속성은 마찬가지로) __get__
방법 및 반환 무엇이든 그 메소드가 리턴 (우리는 조회를 수행 되었기 때문에).
에 대한 자세한 내용 파이썬의 데이터 모델 및 설명 .
답변
속성을 사용하면 속성이없는 (주의 사항을 사용하지 않는 경우) 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
답변
일반적으로 용어와 속성은 같습니다. 그러나 파이썬에는 속성 (또는 다른 데이터)에 대한 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에서는 속성 함수를 사용하여 getter, setter 및 delete 메소드를 정의 할 수 있습니다. read 속성 만 원한다면 메소드 위에 추가 할 수있는 @property 데코레이터도 있습니다.
http://docs.python.org/library/functions.html#property
답변
Bernd Klein 사이트 와 2 가지 차이점을 요약 해서 배웠습니다 .
1. 속성은 데이터 캡슐화를 수행하는보다 편리한 방법입니다.
예 : 공개 속성 길이가 Object 인 경우 나중에 프로젝트에서 캡슐화해야합니다. 즉, 개인으로 변경하고 getter 및 setter를 제공하십시오 => 이전에 작성한 많은 코드를 변경해야합니다.
#Old codes
obj1.length=obj1.length+obj2.length
#New codes(Using private attibutes and getter and setter)
obj1.set_lenght(obj1.get_length()+obj2.get_length()) #=> this is ugly
@property 및 @ lenght.setter =>를 사용하면 이전 코드를 변경할 필요가 없습니다.
2. 속성은 여러 속성을 캡슐화 할 수 있습니다
class Person:
def __init__(self, name, physic_health, mental_health):
self.name=name
self.__physic_health=physic_health #physic_health is real value in range [0, 5.0]
self.__mental_health=mental_health #mental_health is real value in range [0, 5.0]
@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
개인 그리고면이 바깥을 향하게에서 직접 액세스 할 수없는, 그들과 함께있는 유일한 방법은 외부 클래스 상호 작용을 축복하는 속성입니다condition
답변
또한 데이터를 캐시하거나 새로 고치는 데 사용하는 명백한 차이점은 없지만 클래스 속성에 연결된 함수가 있습니다. 예를 들어 파일을 한 번 읽고 속성에 할당 된 내용을 유지해야 값이 캐시됩니다.
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