>  기사  >  백엔드 개발  >  Python 고급 __attr__ 객체 속성

Python 고급 __attr__ 객체 속성

巴扎黑
巴扎黑원래의
2016-12-08 09:29:531379검색

Python의 모든 것은 객체이며, 각 객체는 여러 속성을 가질 수 있습니다. Python의 속성에는 통합된 관리 체계가 있습니다.

객체의 속성은 클래스 속성이라고 하는 클래스 정의에서 나올 수 있습니다.

클래스 속성은 클래스 정의 자체에서 나올 수도 있고 클래스 정의에서 상속될 수도 있습니다.

객체의 속성은 객체 속성이라고 하는 객체 인스턴스에 의해 정의될 수도 있습니다.

객체의 속성은 객체의 __dict__ 속성에 저장됩니다.

__dict__는 사전이고 키는 속성 이름이며 해당 값은 속성 자체입니다. 아래의 클래스와 객체를 살펴보겠습니다.

은 다음과 같이 객체의 속성을 얻기 위한 Java의 반사에 해당합니다.

public class UserBean {
    private Integer id;
    private int age;
    private String name;
    private String address;
}
//类实例化
UserBean bean = new UserBean();
bean.setId(100);
bean.setAddress("武汉");
//得到类对象
Class userCla = (Class) bean.getClass();
      
//得到类中的所有属性集合
Field[] fs = userCla.getDeclaredFields();
......
class bird(object):
    feather = True
class chicken(bird):
    fly = False
    def __init__(self, age):
        self.age = age
summer = chicken(2)
print(bird.__dict__)
print(chicken.__dict__)
print(summer.__dict__)

출력:

{'__dict__': fcfce64c0fb6e1f0c9392c27218ee890, '__module__': '__main__', '__weakref__': 20baa19fab49e1428de8ab4aad0df32e, 'feather': True, '__doc__': None}

{'fly': False, '__module__': '__main__', '__doc__': None, '__init__': c51d1476b57e7fe91e8dedc84c3b2a0c}

{'age': 2}

첫 번째 줄은 깃털과 같은 새 클래스의 속성입니다.

두 번째 줄은 fly 및 __init__ 메소드와 같은 Chicken 클래스의 속성입니다.

세 번째 줄은 여름 객체의 속성인 age입니다.

__doc__와 같은 일부 속성은 우리가 정의하지 않지만 Python에 의해 자동으로 생성됩니다. 또한 새 클래스에는 객체 클래스인 상위 클래스도 있습니다(새 정의인 새(객체) 클래스와 마찬가지로). 이 객체 클래스는 Python의 모든 클래스의 상위 클래스입니다.

즉, 하위 클래스의 속성이 상위 클래스의 속성을 재정의합니다.

다음 두 가지 방법을 통해 클래스의 속성을 수정할 수 있습니다.

summer.__dict__['age'] = 3
print(summer.__dict__['age'])
summer.age = 5
print(summer.age)

Python의 속성

동일한 객체의 서로 다른 속성 간에 종속성이 있을 수 있습니다. 속성이 수정되면 해당 속성에 의존하는 다른 속성도 동시에 변경되기를 원합니다. 현재로서는 __dict__를 통해 속성을 정적으로 저장할 수 없습니다. Python은 즉시 속성을 생성하는 여러 가지 방법을 제공합니다. 그 중 하나를 자산이라고 합니다.

class bird(object):
    feather = True
#extends bird class
class chicken(bird):
    fly = False
    def __init__(self, age):
        self.age = age
    def getAdult(self):
        if self.age > 1.0: 
return True
        else: 
return False
    adult = property(getAdult)   # property is built-in
summer = chicken(2)
print(summer.adult)
summer.age = 0.5
print(summer.adult)

여기서의 기능은 트리거와 유사합니다. 성인 속성을 얻을 때마다 getAdult 값이 트리거됩니다.

속성은 내장 함수인 property()를 사용하여 생성됩니다. property()는 최대 4개의 매개변수를 로드할 수 있습니다. 처음 세 개의 매개변수는 각각 쿼리 특성 처리, 특성 수정, 특성 삭제에 사용되는 함수입니다. 마지막 매개변수는 기능의 문서이며 설명을 위한 문자열일 수 있습니다.

class num(object):
    def __init__(self, value):
self.value = value
print &#39;<--init&#39;
    def getNeg(self):
print &#39;<--getNeg&#39;
return self.value * -1
    def setNeg(self, value):
print &#39;<--setNeg&#39;
self.value = (-1) * value
    def delNeg(self):
print("value also deleted")
del self.value
    neg = property(getNeg, setNeg, delNeg, "I&#39;m negative")
x = num(1.1)
print(x.neg)
x.neg = -22
print(x.value)
print(num.neg.__doc__)
del x.neg

전체 과정에서 해당 함수가 호출되지 않았습니다.

즉, neg 속성의 생성, 설정, 삭제가 모두 property()를 통해 등록됩니다.

Python 특수 메서드 __getattr__(일반적으로 사용됨)

__getattr__(self, name)을 사용하면 생성된 속성을 즉시 쿼리할 수 있습니다.

Python에서 객체 속성은 동적이며 필요에 따라 언제든지 속성을 추가하거나 삭제할 수 있습니다.

그런 다음 getattr의 기능은 이러한 속성을 생성할 때 판단 처리 계층을 수행하는 것입니다.

예:

class bird(object):
    feather = True
class chicken(bird):
    fly = False
    def __init__(self, age):
self.age = age
    def __getattr__(self, name):
if name == &#39;adult&#39;:
if self.age > 1.0: 
return True
else: 
return False
else: 
raise AttributeError(name)
summer = chicken(2)
print(summer.adult)
summer.age = 0.5
print(summer.adult)
print(summer.male)

각 기능에는 자체 처리 기능이 필요하며 __getattr__은 동일한 기능에서 즉시 생성된 모든 속성을 처리할 수 있습니다. __getattr__은 함수 이름에 따라 다양한 속성을 처리할 수 있습니다. 예를 들어 위의 속성 이름 남성을 쿼리하면 AttributeError가 발생합니다.

(Python에는 속성을 쿼리하는 데 사용되는 __getattribute__ 특수 메서드도 있습니다.

__getattr__은 __dict__ 시스템에 없는 속성을 쿼리하는 데만 사용할 수 있습니다.)

__setattr__(self, name, value) 및 __delattr__(self, name)을 사용하여 속성을 수정하고 삭제할 수 있습니다.

적용 범위가 더 넓으며 모든 속성에 사용할 수 있습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.