この記事の内容は、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 文で判定したい場合は、2 つの変数の型が同じかどうかを比較する必要があります:
>>> 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 などを直接記述することもできますが、次の場合はどうなるでしょうか。オブジェクトが関数かどうかを判断したいですか? type モジュールで定義された定数を使用できます:
>>> 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(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']
残りは通常の属性またはメソッドです。 lower() は小文字の文字列を返します:
>>> dir('abc') File "<stdin>", line 1 dir('abc') ^ SyntaxError: invalid character in identifier注意括号要英文下的括号
単に属性とメソッドをリストし、 getattr()、setattr()、および hasattr() と連携するだけでは十分ではありません。オブジェクトの状態を直接操作できます:
>>> len('asd') 3 >>> 'asd'.__len__() 3
存在しない属性を取得しようとすると、AttributeError がスローされます:
>>> 'ASDD'.lower() 'asdd'
>>> 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
>>> getattr(obj,'Z') Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'MyObject' object has no attribute 'Z' >>>
関連推奨事項:
Python オブジェクト指向の継承とポリモーフィズム以上がPythonオブジェクト指向によるオブジェクト情報の取得の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。