Heim >Backend-Entwicklung >Python-Tutorial >Python objektorientiertes Abrufen von Objektinformationen
Der Inhalt dieses Artikels befasst sich mit dem objektorientierten Abrufen von Objektinformationen. Er hat einen bestimmten Referenzwert.
Wie geht es Ihnen, wenn wir einen Verweis auf ein Objekt erhalten? Wissen Sie, um welchen Typ es sich bei diesem Objekt handelt und welche Methoden es hat?
Zuerst bestimmen wir den Objekttyp mit der Funktion type():
Grundtypen können mit type() bestimmt werden:
>>> type(123) <class 'int'> >>> type('jeff') <class 'str'> >>> type(True) <class 'bool'> >>> type(None) <class 'NoneType'>
Wenn eine Variable auf eine Funktion oder Klasse zeigt, können Sie auch type() verwenden, um Folgendes zu bestimmen:
>>> type(abs) <class 'builtin_function_or_method'>
Aber welchen Typ gibt die Funktion type() zurück? Es gibt den entsprechenden Klassentyp zurück. Wenn wir in einer if-Anweisung beurteilen möchten, müssen wir vergleichen, ob die Typtypen der beiden Variablen gleich sind:
>>> type(123) == type(456) True >>> type('jeff') == type('1993') True >>> type('jeff') == str True >>> type(123) == int True >>> type(123) == type('jeff') False
Um den grundlegenden Datentyp zu beurteilen, können Sie int, str, direkt schreiben, usw., aber wenn Sie beurteilen möchten, ob ein Objekt vorhanden ist, wie sieht es mit Funktionen aus? Sie können die im Typenmodul definierten Konstanten verwenden:
>>> 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
Verwenden Sie isinstance()
Für Klassenvererbungsbeziehungen ist die Verwendung von type() sehr unpraktisch. Wenn wir den Typ der Klasse bestimmen möchten, können wir die Funktion isinstance() verwenden.
Sehen wir uns das letzte Beispiel an. Wenn die Vererbungsbeziehung lautet:
Objekt, Tier, Hund, 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...
, dann kann isinstance() dies erkennen Wir, ob ein Objekt von einem bestimmten Typ ist. Erstellen Sie zunächst 3 Objekttypen:
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
und Sie können auch feststellen, ob eine Variable zu einem bestimmten Typ gehört. Mit dem folgenden Code kann beispielsweise ermittelt werden, ob es sich um einen handelt Liste oder Tupel:
>>> isinstance([1,2,3],(tuple,list)) True >>> isinstance((1,2,3),(tuple,list)) True >>> isinstance(1,(tuple,list)) False
Wenn Sie alle Eigenschaften und Methoden eines Objekts abrufen möchten, können Sie die Funktion dir() verwenden Gibt ein Zeichen zurück, das eine Liste von Zeichenfolgen enthält, um beispielsweise alle Attribute und Methoden eines Str-Objekts abzurufen:
>>> 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注意括号要英文下的括号
Attribute und Methoden ähnlich __xxx__ haben in Python spezielle Verwendungszwecke, z. B. __len__ Methode gibt die Länge zurück. Wenn Sie in Python die Funktion len() aufrufen, um zu versuchen, die Länge eines Objekts zu ermitteln, ruft die Funktion tatsächlich innerhalb der Funktion len() automatisch die Methode __len__() des Objekts auf, sodass der folgende Code äquivalent ist:
>>> len('asd') 3 >>> 'asd'.__len__() 3
Der Rest sind gewöhnliche Attribute oder Methoden, z. B. gibt „lower()“ eine Zeichenfolge in Kleinbuchstaben zurück:
>>> 'ASDD'.lower() 'asdd'
Bei getattr() reicht es nicht aus, nur die Attribute und Methoden aufzulisten. , setattr() und hasattr() können wir den Zustand eines Objekts direkt manipulieren:
>>> 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
Wenn Sie versuchen, ein nicht vorhandenes Attribut abzurufen, wird ein AttributeError ausgegeben:
>>> getattr(obj,'Z') Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'MyObject' object has no attribute 'Z' >>>
Sie können einen Standardparameter übergeben, wenn das Attribut nicht vorhanden ist, wird es auf den Standardwert zurückgesetzt:
>>> getattr(obj,'Z',404) 404
Sie können auch die Methode des Objekts abrufen:
>>> 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
Verwandte Empfehlungen:
Python objektorientierte Vererbung und Polymorphismus
Python objektorientierte Zugriffsbeschränkungen
Objektorientierte Python-Klassen und Beispiele
Das obige ist der detaillierte Inhalt vonPython objektorientiertes Abrufen von Objektinformationen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!