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 '<--init' def getNeg(self): print '<--getNeg' return self.value * -1 def setNeg(self, value): print '<--setNeg' self.value = (-1) * value def delNeg(self): print("value also deleted") del self.value neg = property(getNeg, setNeg, delNeg, "I'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 == 'adult': 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)을 사용하여 속성을 수정하고 삭제할 수 있습니다.
적용 범위가 더 넓으며 모든 속성에 사용할 수 있습니다.