Python面向对象之获取对象信息

本篇文章给大家分享的内容是关于Python面向对象之获取对象信息,有着一定的参考价值,有需要的朋友可以参考一下

当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?

使用type()

首先,我们来判断对象类型,使用type()函数:

基本类型都可以使用type()判断:

>>> type(123)

>>> type('jeff')

>>> type(True)

>>> type(None)

如果一个变量指向函数或者类,也可以用type()判断:

>>> type(abs)

但是type()函数返回的是什么类型呢?它返回对应的Class类型。如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同:

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

判断基本数据类型可以直接写int、str等,但如果要判断一个对象是否是函数怎么办?可以使用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

使用 isinstance()

对于class的继承关系来说,使用type()就很不方便。我们要判断class的类型,就可以使用isinstance()函数。

我们回顾上次的例子如果继承关系是:

object、Animal、Dog、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...

那么,isinstance()就可以告诉我们,一个对象是否是某种类型。先创建3中类型的对象:

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

并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:

>>> isinstance([1,2,3],(tuple,list))
True
>>> isinstance((1,2,3),(tuple,list))
True
>>> isinstance(1,(tuple,list))
False

使用dir()

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个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 "", line 1
    dir('abc')
       ^
SyntaxError: invalid character in identifier注意括号要英文下的括号

类似__xxx__的属性和方法再Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:

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

剩下的都是普通属性或方法,比如lower()返回小写的字符串:

>>> 'ASDD'.lower()
'asdd'

仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:

>>> 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

如果试图获取不存在的属性,会抛出AttributeError的错误:

>>> getattr(obj,'Z')
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'MyObject' object has no attribute 'Z'
>>>

可以传入一个default参数,如果属性不存在,就反回默认值:

>>> getattr(obj,'Z',404)
404

也可以获得对象的方法:

>>> hasattr(obj, 'power') # 有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of >
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量 fn
>>> fn # fn 指向 obj.power
<bound method MyObject.power of >
>>> fn() # 调用 fn()与调用 obj.power()是一样的
81

相关推荐:

Python面向对象之继承和多态

Python面向对象之访问限制

Python面向对象之类和实例

以上就是Python面向对象之获取对象信息的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

失控进化高级武器获取方式

失控进化AK47获取方法,AK47突击步枪、火箭筒、C4定时炸弹”绝对是站在武器链顶端的“硬通货”,不管是游龙各种据点,还是和其他玩家火拼时的硬核输出,这些顶级武器往手里一握,瞬间就有了横着走的底气。今天就把老玩家私藏的获取秘籍扒出来,让你轻松把顶级武器收入囊中! 失控进化高级武器获取方式: 一、军事隧道的红卡房: 红卡房内的军火箱,打开它们出AK47和爆炸物的概率不低,但想进红卡房,绿卡>...

《太吾绘卷:天幕心帷》快速定向获取促织王方法介绍

《太吾绘卷:天幕心帷》中的获取促织王是游戏里经常需要做的事情,而想要快速获得促织王就需要一些技巧,首先是我们需要攒大量的那个药材和那个食材,你可以去回春堂和伏牛帮那里买引子。 太吾绘卷天幕心帷怎么快速获得促织王 用药饭换恩义,用恩义换心材,用心材换蛰室,用王公技能换促织缘,用促织许愿换促织王,用斗蛐蛐换做菜饭的资源,左脚踩右脚,可持续发展,又好又快获取促织王。 本文内容来源于互联网,如有侵权请联系...

《红色沙漠》全冒险类知识获取位置分享

《红色沙漠》中的冒险类知识是游戏里非常有趣的一种特殊收集品,而想要全收集冒险类知识就需要一些技巧,首先是地形类知识,第一个是埃尔南德区域的黑森林,就是位于埃尔南德罗伯茨领地的森林。 红色沙漠冒险类知识怎么获得 1.地形-埃尔南德 本文内容来源于互联网,如有侵权请联系删除。

《三国大冒险》觉醒丹获取攻略

三国大冒险觉醒丹怎么获取?三国大冒险可让玩家们通过培养武将来提升他们的战力,需要消耗大量的资源,也令各资源的获取方式被很多玩家所在意。那三国大冒险觉醒丹怎么获得?别急,小编已经将它的获取方法进行了整合,并在下边为玩家们一一进行了罗列,各位可参照着去进行获取,就能拿到非常多。 《三国大冒险》觉醒丹获取攻略 三国大冒险里并没有觉醒丹这一道具,有的只是进阶丹,它的作用也很简单,那就是能为武将进阶。每次进...

幻塔拟态获取及提升方式

幻塔拟态如何获取,在卡池里抽取武器,抽中SR或者SSR都会给一个拟态,拟态相当于皮肤外观,拟态作为游戏里既好看又实用的功能,在增补玩家战斗力的同时,也带来了好看的造型,让玩家摆脱时装太少的尴尬。 幻塔拟态获取及提升方式: 1、拟态获取方式 在卡池里抽取武器,抽中SR或者SSR都会给一个拟态,拟态相当于皮肤外观,你可以理解成抽出了一个角色,但也不算职业类型的。 2、造型的切换 切换造型的地方就在【时...

神将传说将印获取、合成与重铸攻略

神将传说将印系统解析,将印系统是每位武将培养的必经之路,它不仅提供基础属性加成,其附带的战法技能更是影响战局的关键。由于每位武将均需装备,将印的需求量极大。本篇将为您系统解析将印的获取、养成与核心操作,助您高效打造武将的神兵利器。 神将传说将印获取、合成与重铸攻略: 一、将印说明 1、每名武将最多拥有两个将印槽,分别为100级和7星解锁,佩戴将印将为武将提高属性和附加额外战法技能。 2、每个武将将...

神将传说战法系统获取及运用攻略

神将传说战法系统如何获取,战法系统作为武将6星后开启的重要养成模块,能深度定制武将的战斗风格,直接影响阵容的实战表现。本文将从获取途径、搭配策略到养成建议,为您全面解析战法系统的奥秘,助您合理规划,高效养成。 神将传说战法系统获取及运用攻略: 一、战法获取途径 低阶战法:主城-商店-基础商城-战法商城,可使用将印石兑换。将印石可通过将印副本,血战长坂,道具商城,荣誉长城等途径获取。 高阶战法:通过...

《神将传说》资源获取及使用建议

神将传说资源如何获取,基础资源中,用于直接提升武将等级的武将经验在游戏前期较为稀缺,而到了中后期则趋于饱和,此外,不建议在神秘商店中使用元宝购买基础资源,它们都有对应的获取渠道,元宝应当消耗在更关键的地方。 《神将传说》资源获取及使用建议: 一、武将资源 除了常规的武将寻访,饮酒讨彩和主题武将活动也是获取武将的重要途径。奖池中不仅包含武将、武将碎片聚贤令和寻访令,累计达到一定次数后,还会额外赠送大...