programing

Python의 "property"와 "attribute"의 차이점은 무엇입니까?

bestcode 2022. 9. 28. 00:13
반응형

Python의 "property"와 "attribute"의 차이점은 무엇입니까?

나는 일반적으로 '속성'과 '속성'의 차이에 대해 혼란스러워하고 있으며, 그 차이를 간결하게 설명할 수 있는 훌륭한 자원을 찾을 수 없다.

속성은 특별한 종류의 속성입니다.기본적으로 Python이 다음 코드를 발견했을 때:

spam = SomeObject()
print(spam.eggs)

위를 보다eggsspam를 검사합니다.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

반응형