Objektinformationen erhalten (Liao Xuefeng)

Woher wissen wir, welchen Typ dieses Objekt hat und welche Methoden es gibt, wenn wir einen Verweis auf ein Objekt erhalten?

Verwenden Sie type ()

Lassen Sie uns zunächst den Objekttyp bestimmen und die type()Funktion verwenden:

Grundtypen können type()beurteilt werden:

>>> type(123)
<class 'int'>
>>> type('str')
<class 'str'>
>>> type(None)
<type(None) 'NoneType'>

Wenn eine Variable auf eine Funktion oder Klasse zeigt, können Sie auch ein type()Urteil verwenden:

>>> type(abs)
<class 'builtin_function_or_method'>
>>> type(a)
<class '__main__.Animal'>

Aber type()welchen Typ gibt die Funktion zurück? Es gibt den entsprechenden Klassentyp zurück. Wenn wir in der ifAussage beurteilen wollen , müssen wir vergleichen, ob die Typtypen der beiden Variablen gleich sind:

>>> type(123)==type(456)
True
>>> type(123)==int
True
>>> type('abc')==type('123')
True
>>> type('abc')==str
True
>>> type('abc')==type(123)
False

Bestimmen Sie die grundlegenden Datentypen direkt geschrieben werden können int, strund so weiter, aber wenn Sie möchten , um zu bestimmen , ob ein Objekt eine Funktion, wie zu tun? Sie können typesdie im Modul 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 die Vererbungsbeziehung der Klasse type()ist die Verwendung sehr unpraktisch. Wir müssen die Art der Klasse beurteilen, wir können isinstance()Funktionen verwenden.

Wir erinnern uns an das vorherige Beispiel, wenn die Vererbungsbeziehung lautet:

object -> Animal -> Dog -> Husky

Dann können isinstance()wir feststellen, ob ein Objekt von einem bestimmten Typ ist. Erstellen Sie zunächst drei Arten von Objekten:

>>> a = Animal()
>>> d = Dog()
>>> h = Husky()

Dann urteile:

>>> isinstance(h, Husky)
True

Kein Problem, da die hVariable auf das Husky-Objekt zeigt.

Dann urteile:

>>> isinstance(h, Dog)
True

hObwohl es sich um einen Husky-Typ handelt, ist Husky immer hnoch ein Hundetyp, da er von Dog geerbt wurde . Mit anderen Worten, isinstance()es wird beurteilt, ob ein Objekt der Typ selbst ist oder sich in der übergeordneten Vererbungskette des Typs befindet.

Daher können wir sicher sein, dass es sich hum den Tiertyp handelt:

>>> isinstance(h, Animal)
True

Ebenso ist der tatsächliche Typ Hunde- dund Tiertyp:

>>> isinstance(d, Dog) and isinstance(d, Animal)
True

Allerdings dnicht der Husky-Typ:

>>> isinstance(d, Husky)
False

Verfügbare type()Grundtypen der Bestimmung verwendet werden , isinstance()um zu bestimmen:

>>> isinstance('a', str)
True
>>> isinstance(123, int)
True
>>> isinstance(b'a', bytes)
True

Außerdem kann festgestellt werden, ob es sich bei einer Variablen um einen bestimmten Typ handelt, z. B. kann der folgende Code bestimmen, ob es sich um eine Liste oder ein Tupel handelt:

>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
True
Verwenden Sie immer isinstance (), um den Typ zu bestimmen, und Sie können "alle Typen" des angegebenen Typs und seiner Unterklassen angeben.

Verwenden Sie dir ()

Wenn Sie alle Eigenschaften und Methoden eines Objekts abrufen möchten, können Sie eine dir()Funktion verwenden, die eine Liste mit Zeichenfolgen zurückgibt. Sie können beispielsweise alle Eigenschaften und Methoden eines str-Objekts abrufen:

>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

Ähnliche __xxx__Eigenschaften und Methoden werden in Python speziell verwendet, z. B. die __len__Länge der Methodenrückgabe. Wenn Sie in Python eine len()Funktion aufrufen , um die Länge eines Objekts zu ermitteln, len()ruft sie innerhalb der Funktion automatisch die __len__()Methode des Objekts auf , sodass der folgende Code äquivalent ist:

>>> len('ABC')
3
>>> 'ABC'.__len__()
3

Wenn wir die Klasse verwenden möchten, die wir len(myObj)selbst geschrieben haben, schreiben Sie selbst eine __len__()Methode:

>>> class MyDog(object):
...     def __len__(self):
...         return 100
...
>>> dog = MyDog()
>>> len(dog)
100

Der Rest sind gewöhnliche Attribute oder Methoden, z. B. die lower()Rückgabe einer Zeichenfolge in Kleinbuchstaben:

>>> 'ABC'.lower()
'abc'

Nur die aufgeführten Eigenschaften und Methoden ist nicht genug , um zu treffen getattr(), setattr()und hasattr()wir können ein Objekt der Status direkt manipulieren:

>>> class MyObject(object):
...     def __init__(self):
...         self.x = 9
...     def power(self):
...         return self.x * self.x
...
>>> obj = MyObject()

Als Nächstes können Sie die Eigenschaften des Objekts testen:

>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19

Wenn Sie versuchen, ein nicht vorhandenes Attribut abzurufen, wird ein AttributeError ausgelöst:

>>> getattr(obj, 'z') # 获取属性'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 der Standardwert zurückgegeben:

>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
404

Sie können auch die Objektmethode 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

Zusammenfassung

Durch eine Reihe integrierter Funktionen können wir jedes Python-Objekt analysieren und seine internen Daten abrufen. Es ist zu beachten, dass wir die Objektinformationen nur erhalten, wenn die Objektinformationen nicht bekannt sind. Wenn Sie direkt schreiben können:

sum = obj.x + obj.y

Schreiben Sie einfach nicht:

sum = getattr(obj, 'x') + getattr(obj, 'y')

Ein Beispiel für die korrekte Verwendung lautet wie folgt:

def readImage(fp):
    if hasattr(fp, 'read'):
        return readData(fp)
    return None

Angenommen, wir möchten das Bild aus dem Dateistream fp lesen. Zuerst müssen wir feststellen, ob das fp-Objekt über eine Lesemethode verfügt. Wenn es existiert, ist das Objekt ein Stream. Wenn es nicht existiert, kann es nicht gelesen werden. hasattr()Es war praktisch.

Bitte beachten Sie, dass es in dynamischen Sprachen wie Python read()Methoden gibt, die dem Ententyp entsprechen. Dies bedeutet nicht, dass das fp-Objekt ein Dateistream ist, es kann auch ein Netzwerk-Stream sein oder es kann ein Byte-Stream im Speicher sein, aber solange die read()Methode zurückkehrt Was gültige Bilddaten sind, hat keinen Einfluss auf die Funktion des Lesens des Bildes.

Referenzquellcode

get_type.py

attrs.py

Veröffentlicht 17 Originalartikel · Like1 · Besuche 819

Ich denke du magst

Origin blog.csdn.net/weixin_45433031/article/details/105013320
Empfohlen
Rangfolge