自学Python day6--------面向对象编程(获取对象信息)

来源:互联网 发布:淘宝开店能挣钱吗 编辑:程序博客网 时间:2024/06/09 19:15

自学Python day6——–面向对象编程(获取对象信息)

1.使用type()
可以通过使用type()来判断对象的基本类型:

type(123)inttype('str')str

也可以判断函数或者类:

type(abs)builtin_function_or_methodclass Student(object):    def __init__(self,name,socre,num):        self.name = name        self.socre = socre        self.num = numa = Student('Jim',22,33)type(a)__main__.Student

也可以比较两个对象的类似是否相同,相同返回Ture,反之False如:

type(321) == type(222)Turetype(333) == intTuretype(222) == tpye('333')False

2.使用isinstance()

而对于class的继承关系可以用isinstance()来判断,若属于同一个类的子类,则返回Ture

class Ball(object):    def __inti__(self,name,num):        self.name = name        self.num = numclass Football(Ball):    def __inti__(self,name,num):        self.name = name        self.num = numclass socre(Ball):    def __inti__(self,name,num):        self.name = name        self.num = numa = Ball()b = Football()c = socre()isinstance(a,Ball)Trueisinstance(b,Ball)Trueisinstance(c,Ball)True

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

isinstance([1, 2, 3], (list, tuple))Trueisinstance((1, 2, 3), (list, tuple))Truedir('ABD')

3.使用dir()
如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法:
dir(‘ABC’)

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

len('AB')2'AB'.__len__()2 class MyDog(object):...     def __len__(self):...         return 100... dog = MyDog() len(dog)100

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

‘ABC’.lower()
‘abc’

仅仅把属性和方法列出来是不够的,配合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') # 有属性'x'吗?True>>> obj.x9>>> hasattr(obj, 'y') # 有属性'y'吗?False>>> setattr(obj, 'y', 19) # 设置一个属性'y'>>> hasattr(obj, 'y') # 有属性'y'吗?True>>> getattr(obj, 'y') # 获取属性'y'19>>> obj.y # 获取属性'y'19

一个正确的用法的例子如下:

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

假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。

请注意,在Python这类动态语言中,根据鸭子类型,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。

0 0
原创粉丝点击