이 글의 내용은 Python 객체지향에서 객체 정보를 얻는 것에 관한 것입니다. 특정 참조 값이 있습니다. 필요한 친구가 참조할 수 있습니다.
객체에 대한 참조를 얻을 때 객체가 무엇인지 어떻게 알 수 있나요? 어떤 종류와 방법이 있나요?
먼저 type() 함수를 사용하여 개체 유형을 결정합니다.
기본 유형은 type()을 사용하여 결정할 수 있습니다.
>>> type(123) <class 'int'> >>> type('jeff') <class 'str'> >>> type(True) <class 'bool'> >>> type(None) <class 'NoneType'>
변수가 함수나 클래스를 가리키는 경우 다음을 수행할 수 있습니다. type()도 사용하세요) 판단:
>>> type(abs) <class 'builtin_function_or_method'>
그런데 type() 함수는 어떤 유형을 반환하나요? 해당 클래스 유형을 반환합니다. if 문에서 판단하려면 두 변수의 유형이 같은지 비교해야 합니다.
>>> type(123) == type(456) True >>> type('jeff') == type('1993') True >>> type('jeff') == str True >>> type(123) == int True >>> type(123) == type('jeff') False
기본 데이터 유형을 판단하려면 int, str 등을 직접 작성할 수 있지만, 만약 객체가 함수인지 판단하고 싶으신가요? 유형 모듈에 정의된 상수를 사용할 수 있습니다.
>>> import types >>> def fn(): ... pass ... >>> type(fn) == types.FunctionType True >>> type(abs) == types.BuiltinFunctionType True >>> type(lambda x:x) == types.LambdaType True >>> type((x for x in range(10))) == types.GeneratorType True
isinstance() 사용
클래스 상속 관계의 경우 type()을 사용하는 것이 매우 불편합니다. 클래스 유형을 확인하려면 isinstance() 함수를 사용할 수 있습니다.
마지막 예를 검토해 보겠습니다. 상속 관계가 다음과 같다면:
object, Animal, Dog, Husky
class Animal(object): def run(self): print('Animal is running...') class Dog(Animal): def run(self): print('Dog is haha running...') def eat(self): print('Eating meat...') class Cat(Animal): def run(self): print('Cat is miaomiao running...') def eat(self): print('Eating fish...') class Husky(Dog): def run(self): print('Husky is miaomiao running...') dog = Dog() dog.run() dog.eat() xinxin = Husky() xinxin.run() cat = Cat() cat.run() cat.eat()
Dog is haha running... Eating meat... Husky is miaomiao running... Cat is miaomiao running... Eating fish...
그런 다음 isinstance()는 객체가 특정 유형인지 여부를 알려줄 수 있습니다. 먼저 3가지 유형의 객체를 만듭니다:
a= Animal() d = Dog() h = Husky() print(isinstance(h,Husky)) print(isinstance(h,Dog)) print(isinstance(h,Animal)) print(isinstance(h,object)) print(isinstance('a',str)) print(isinstance(123,int))
True True True True True True
print(isinstance(d,Husky)) False
그리고 변수가 특정 유형 중 하나인지 확인할 수도 있습니다. 예를 들어 다음 코드는 목록인지 튜플인지 확인할 수 있습니다.
>>> isinstance([1,2,3],(tuple,list)) True >>> isinstance((1,2,3),(tuple,list)) True >>> isinstance(1,(tuple,list)) False
객체의 모든 속성과 메서드를 얻으려면 문자열이 포함된 목록을 반환하는 dir() 함수를 사용할 수 있습니다. 예를 들어 str 객체의 모든 속성과 메서드를 얻으려면
>>> dir(123) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__pmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floorp__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rpmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloorp__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruep__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truep__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes'] >>> dir('jeff') ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> dir('abc') File "<stdin>", line 1 dir('abc') ^ SyntaxError: invalid character in identifier注意括号要英文下的括号
__xxx__ 및 메소드와 유사한 속성은 길이를 반환하는 __len__ 메소드와 같이 Python에서 특별한 용도로 사용됩니다. Python에서 객체의 길이를 가져오기 위해 len() 함수를 호출하면 실제로 len() 함수 내에서 자동으로 객체의 __len__() 메서드를 호출하므로 다음 코드는 동일합니다.
>>> len('asd') 3 >>> 'asd'.__len__() 3
나머지는 일반적인 속성 또는 메소드입니다. 예를 들어 lower()는 소문자 문자열을 반환합니다.
>>> 'ASDD'.lower() 'asdd'
속성과 메소드를 나열하는 것만으로는 충분하지 않으며 getattr(), setattr() 및 hasattr()과 협력합니다. 객체의 상태를 직접 조작할 수 있습니다.
>>> class MyObject(object): ... def __init__(self): ... self.x = 9 ... def power(self): ... return self.x*self.x >>> >>> obj = MyObject() >>> hasattr(obj,'x') True >>> obj.x 9 >>> hasattr(obj,'y') False >>> setattr(obj,'y',19) >>> hasattr(obj,'y') True >>> getattr(obj,'y') 19
존재하지 않는 속성을 얻으려고 하면 AttributeError가 발생합니다.
>>> getattr(obj,'Z') Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'MyObject' object has no attribute 'Z' >>>
기본 매개변수를 전달할 수 있으며, 속성이 존재하지 않으면 기본값이 반환됩니다:
>>> getattr(obj,'Z',404) 404
객체의 메서드도 얻을 수 있습니다:
>>> hasattr(obj, 'power') # 有属性'power'吗? True >>> getattr(obj, 'power') # 获取属性'power' <bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>> >>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量 fn >>> fn # fn 指向 obj.power <bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>> >>> fn() # 调用 fn()与调用 obj.power()是一样的 81
관련 권장 사항:
위 내용은 Python 객체지향 객체 정보 획득의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!