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 if
Aussage 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
, str
und so weiter, aber wenn Sie möchten , um zu bestimmen , ob ein Objekt eine Funktion, wie zu tun? Sie können types
die 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 h
Variable auf das Husky-Objekt zeigt.
Dann urteile:
>>> isinstance(h, Dog)
True
h
Obwohl es sich um einen Husky-Typ handelt, ist Husky immer h
noch 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 h
um den Tiertyp handelt:
>>> isinstance(h, Animal)
True
Ebenso ist der tatsächliche Typ Hunde- d
und Tiertyp:
>>> isinstance(d, Dog) and isinstance(d, Animal)
True
Allerdings d
nicht 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 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.