Maison > développement back-end > Tutoriel Python > Python orienté objet pour obtenir des informations sur les objets

Python orienté objet pour obtenir des informations sur les objets

不言
Libérer: 2018-04-14 10:28:11
original
1652 Les gens l'ont consulté

Le contenu de cet article concerne l'obtention d'informations sur un objet en Python orienté objet. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer

Lorsque nous obtenons une référence à un objet, comment faites-vous. savez-vous de quel type est cet objet et de quelles méthodes il dispose ?

Utiliser type()

Tout d'abord, nous déterminons le type d'objet à l'aide de la fonction type() :

Les types de base peuvent être déterminés à l'aide de type() :

>>> 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;>
Copier après la connexion

Si une variable pointe vers une fonction ou une classe, vous pouvez également utiliser type() pour déterminer :

>>> type(abs)
<class &#39;builtin_function_or_method&#39;>
Copier après la connexion

Mais quel type la fonction type() renvoie-t-elle ? Il renvoie le type de classe correspondant. Si nous voulons juger dans une instruction if, nous devons comparer si les types de types des deux variables sont les mêmes :

>>> 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
Copier après la connexion

Pour juger le type de données de base, vous pouvez écrire directement int, str, etc., mais si vous voulez juger si un objet est Qu'en est-il des fonctions ? Vous pouvez utiliser les constantes définies dans le module types :

>>> 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
Copier après la connexion

Utiliser isinstance()

Pour les relations d'héritage de classe, il est très gênant d'utiliser type(). Si nous voulons déterminer le type de classe, nous pouvons utiliser la fonction isinstance().

Revoyons le dernier exemple. Si la relation d'héritage est :

objet, Animal, Chien, 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()
Copier après la connexion
Dog is haha running...
Eating meat...
Husky is miaomiao running...
Cat is miaomiao running...
Eating fish...
Copier après la connexion

alors, isinstance() peut le dire. Nous, si un objet est d'un certain type. Créez d'abord 3 types d'objets :

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))
Copier après la connexion
True
True
True
True
True
True
Copier après la connexion
print(isinstance(d,Husky))
False
Copier après la connexion

et vous pouvez également déterminer si une variable fait partie de certains types. Par exemple, le code suivant peut déterminer si Est un. liste ou tuple :

>>> isinstance([1,2,3],(tuple,list))
True
>>> isinstance((1,2,3),(tuple,list))
True
>>> isinstance(1,(tuple,list))
False
Copier après la connexion

Utilisez dir()

Si vous souhaitez obtenir toutes les propriétés et méthodes d'un objet, vous pouvez utiliser la fonction dir(), qui renvoie un caractère contenant Une liste de chaînes, par exemple, pour obtenir tous les attributs et méthodes d'un objet str :

>>> 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;]
Copier après la connexion
>>> dir(&#39;abc&#39;)  File "<stdin>", line 1
    dir(&#39;abc&#39;)
       ^
SyntaxError: invalid character in identifier注意括号要英文下的括号
Copier après la connexion

Les attributs et méthodes similaires à __xxx__ ont des utilisations spéciales en Python, comme __len__ La méthode renvoie la longueur. En Python, si vous appelez la fonction len() pour essayer d'obtenir la longueur d'un objet, en fait, à l'intérieur de la fonction len(), elle appelle automatiquement la méthode __len__() de l'objet, donc le code suivant est équivalent :

>>> len(&#39;asd&#39;)
3
>>> &#39;asd&#39;.__len__()
3
Copier après la connexion

Les autres sont des attributs ou des méthodes ordinaires, tels que lower() renvoie une chaîne minuscule :

>>> &#39;ASDD&#39;.lower()
&#39;asdd&#39;
Copier après la connexion

Il ne suffit pas de lister les attributs et les méthodes avec getattr(). , setattr() et hasattr(), on peut manipuler directement l'état d'un objet :

>>> 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
Copier après la connexion

Si vous essayez d'obtenir un attribut inexistant, une AttributeError sera levée :

>>> 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;
>>>
Copier après la connexion

Vous pouvez passer un paramètre par défaut. Si l'attribut n'existe pas, il reviendra à la valeur par défaut :

>>> getattr(obj,&#39;Z&#39;,404)
404
Copier après la connexion

Vous pouvez également récupérer la méthode de l'objet :

>>> 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
Copier après la connexion

Recommandations associées :

Héritage et polymorphisme orientés objet Python

Restrictions d'accès orientées objet Python

Classes et exemples orientés objet Python














Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal