Maison > Article > développement back-end > Python orienté objet pour obtenir des informations sur les objets
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 ?
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 'int'> >>> type('jeff') <class 'str'> >>> type(True) <class 'bool'> >>> type(None) <class 'NoneType'>
Si une variable pointe vers une fonction ou une classe, vous pouvez également utiliser type() pour déterminer :
>>> type(abs) <class 'builtin_function_or_method'>
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('jeff') == type('1993') True >>> type('jeff') == str True >>> type(123) == int True >>> type(123) == type('jeff') False
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
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('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...
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('a',str)) print(isinstance(123,int))
True True True True True True
print(isinstance(d,Husky)) False
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
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) ['__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注意括号要英文下的括号
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('asd') 3 >>> 'asd'.__len__() 3
Les autres sont des attributs ou des méthodes ordinaires, tels que lower() renvoie une chaîne minuscule :
>>> 'ASDD'.lower() 'asdd'
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,'x') True >>> obj.x 9 >>> hasattr(obj,'y') False >>> setattr(obj,'y',19) >>> hasattr(obj,'y') True >>> getattr(obj,'y') 19
Si vous essayez d'obtenir un attribut inexistant, une AttributeError sera levée :
>>> getattr(obj,'Z') Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'MyObject' object has no attribute 'Z' >>>
Vous pouvez passer un paramètre par défaut. Si l'attribut n'existe pas, il reviendra à la valeur par défaut :
>>> getattr(obj,'Z',404) 404
Vous pouvez également récupérer la méthode de l'objet :
>>> 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
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!