Heim  >  Artikel  >  Backend-Entwicklung  >  Python objektorientiertes Abrufen von Objektinformationen

Python objektorientiertes Abrufen von Objektinformationen

不言
不言Original
2018-04-14 10:28:111542Durchsuche

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?

Verwenden Sie type()

Zuerst bestimmen wir den Objekttyp mit der Funktion type():

Grundtypen können mit type() bestimmt werden:

>>> type(123)
<class &#39;int&#39;>
>>> type(&#39;jeff&#39;)
<class &#39;str&#39;>
>>> type(True)
<class &#39;bool&#39;>
>>> type(None)
<class &#39;NoneType&#39;>

Wenn eine Variable auf eine Funktion oder Klasse zeigt, können Sie auch type() verwenden, um Folgendes zu bestimmen:

>>> type(abs)
<class &#39;builtin_function_or_method&#39;>

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(&#39;jeff&#39;) == type(&#39;1993&#39;)
True
>>> type(&#39;jeff&#39;) == str
True
>>> type(123) == int
True
>>> type(123) == type(&#39;jeff&#39;)
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(&#39;Animal is running...&#39;)

class Dog(Animal):
    def run(self):
        print(&#39;Dog is haha running...&#39;)

    def eat(self):
        print(&#39;Eating meat...&#39;)
class Cat(Animal):
    def run(self):
        print(&#39;Cat is miaomiao running...&#39;)

    def eat(self):
        print(&#39;Eating fish...&#39;)
class Husky(Dog):
    def run(self):
        print(&#39;Husky is miaomiao running...&#39;)
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(&#39;a&#39;,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

Verwenden Sie dir()

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)
[&#39;__abs__&#39;, &#39;__add__&#39;, &#39;__and__&#39;, &#39;__bool__&#39;, &#39;__ceil__&#39;, &#39;__class__&#39;, &#39;__delattr__&#39;, &#39;__dir__&#39;, &#39;__pmod__&#39;, &#39;__doc__&#39;, &#39;__eq__&#39;, &#39;__float__&#39;, &#39;__floor__&#39;, &#39;__floorp__&#39;, &#39;__format__&#39;, &#39;__ge__&#39;, &#39;__getattribute__&#39;, &#39;__getnewargs__&#39;, &#39;__gt__&#39;, &#39;__hash__&#39;, &#39;__index__&#39;, &#39;__init__&#39;, &#39;__int__&#39;, &#39;__invert__&#39;, &#39;__le__&#39;, &#39;__lshift__&#39;, &#39;__lt__&#39;, &#39;__mod__&#39;, &#39;__mul__&#39;, &#39;__ne__&#39;, &#39;__neg__&#39;, &#39;__new__&#39;, &#39;__or__&#39;, &#39;__pos__&#39;, &#39;__pow__&#39;, &#39;__radd__&#39;, &#39;__rand__&#39;, &#39;__rpmod__&#39;, &#39;__reduce__&#39;, &#39;__reduce_ex__&#39;, &#39;__repr__&#39;, &#39;__rfloorp__&#39;, &#39;__rlshift__&#39;, &#39;__rmod__&#39;, &#39;__rmul__&#39;, &#39;__ror__&#39;, &#39;__round__&#39;, &#39;__rpow__&#39;, &#39;__rrshift__&#39;, &#39;__rshift__&#39;, &#39;__rsub__&#39;, &#39;__rtruep__&#39;, &#39;__rxor__&#39;, &#39;__setattr__&#39;, &#39;__sizeof__&#39;, &#39;__str__&#39;, &#39;__sub__&#39;, &#39;__subclasshook__&#39;, &#39;__truep__&#39;, &#39;__trunc__&#39;, &#39;__xor__&#39;, &#39;bit_length&#39;, &#39;conjugate&#39;, &#39;denominator&#39;, &#39;from_bytes&#39;, &#39;imag&#39;, &#39;numerator&#39;, &#39;real&#39;, &#39;to_bytes&#39;]
>>> dir(&#39;jeff&#39;)
[&#39;__add__&#39;, &#39;__class__&#39;, &#39;__contains__&#39;, &#39;__delattr__&#39;, &#39;__dir__&#39;, &#39;__doc__&#39;, &#39;__eq__&#39;, &#39;__format__&#39;, &#39;__ge__&#39;, &#39;__getattribute__&#39;, &#39;__getitem__&#39;, &#39;__getnewargs__&#39;, &#39;__gt__&#39;, &#39;__hash__&#39;, &#39;__init__&#39;, &#39;__iter__&#39;, &#39;__le__&#39;, &#39;__len__&#39;, &#39;__lt__&#39;, &#39;__mod__&#39;, &#39;__mul__&#39;, &#39;__ne__&#39;, &#39;__new__&#39;, &#39;__reduce__&#39;, &#39;__reduce_ex__&#39;, &#39;__repr__&#39;, &#39;__rmod__&#39;, &#39;__rmul__&#39;, &#39;__setattr__&#39;, &#39;__sizeof__&#39;, &#39;__str__&#39;, &#39;__subclasshook__&#39;, &#39;capitalize&#39;, &#39;casefold&#39;, &#39;center&#39;, &#39;count&#39;, &#39;encode&#39;, &#39;endswith&#39;, &#39;expandtabs&#39;, &#39;find&#39;, &#39;format&#39;, &#39;format_map&#39;, &#39;index&#39;, &#39;isalnum&#39;, &#39;isalpha&#39;, &#39;isdecimal&#39;, &#39;isdigit&#39;, &#39;isidentifier&#39;, &#39;islower&#39;, &#39;isnumeric&#39;, &#39;isprintable&#39;, &#39;isspace&#39;, &#39;istitle&#39;, &#39;isupper&#39;, &#39;join&#39;, &#39;ljust&#39;, &#39;lower&#39;, &#39;lstrip&#39;, &#39;maketrans&#39;, &#39;partition&#39;, &#39;replace&#39;, &#39;rfind&#39;, &#39;rindex&#39;, &#39;rjust&#39;, &#39;rpartition&#39;, &#39;rsplit&#39;, &#39;rstrip&#39;, &#39;split&#39;, &#39;splitlines&#39;, &#39;startswith&#39;, &#39;strip&#39;, &#39;swapcase&#39;, &#39;title&#39;, &#39;translate&#39;, &#39;upper&#39;, &#39;zfill&#39;]
>>> dir(&#39;abc&#39;)  File "<stdin>", line 1
    dir(&#39;abc&#39;)
       ^
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(&#39;asd&#39;)
3
>>> &#39;asd&#39;.__len__()
3

Der Rest sind gewöhnliche Attribute oder Methoden, z. B. gibt „lower()“ eine Zeichenfolge in Kleinbuchstaben zurück:

>>> &#39;ASDD&#39;.lower()
&#39;asdd&#39;

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,&#39;x&#39;)
True
>>> obj.x
9
>>> hasattr(obj,&#39;y&#39;)
False
>>> setattr(obj,&#39;y&#39;,19)
>>> hasattr(obj,&#39;y&#39;)
True
>>> getattr(obj,&#39;y&#39;)
19

Wenn Sie versuchen, ein nicht vorhandenes Attribut abzurufen, wird ein AttributeError ausgegeben:

>>> getattr(obj,&#39;Z&#39;)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: &#39;MyObject&#39; object has no attribute &#39;Z&#39;
>>>

Sie können einen Standardparameter übergeben, wenn das Attribut nicht vorhanden ist, wird es auf den Standardwert zurückgesetzt:

>>> getattr(obj,&#39;Z&#39;,404)
404

Sie können auch die Methode des Objekts abrufen:

>>> hasattr(obj, &#39;power&#39;) # 有属性&#39;power&#39;吗?
True
>>> getattr(obj, &#39;power&#39;) # 获取属性&#39;power&#39;
<bound method MyObject.power of <__main__.MyObject object at
0x10077a6a0>>
>>> fn = getattr(obj, &#39;power&#39;) # 获取属性&#39;power&#39;并赋值到变量 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn