1 # 使用dir()
2 print(dir("ABC"))
3 print(len("ABC"))
4
5 # 如果自己实现的类也要实现len(myobj),可以重写__len__方法
6
7
8 class MyDog(object):
9 def __len__(self):
10 return 1000
11
12
13 dog = MyDog()
14 print(len(dog))
15
16 # 仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:
17
18
19 class Myobject(object):
20 def __init__(self):
21 self.x = 9
22
23 def power(self):
24 return self.x * self.x
25
26
27 obj = Myobject()
28 print(hasattr(obj, 'y')) # 有y属性吗
29 setattr(obj, 'y', 19) # 设置一个属性'y' 值为19
30 print(hasattr(obj, 'y')) # 有y属性吗
31 print(getattr(obj, 'y')) # 获取'y'属性的值
32 # 如果不存在z属性就报以下异常
33 # AttributeError: 'Myobject' object has no attribute 'z'
34 # getattr(obj, 'z')
35 # 在使用getattr 如果没有的话可以传入一个默认值
36 print(getattr(obj, 'w', 500)) # 获取属性'w',如果不存在,返回默认值500
37
38
39 # 也可以获取对象的方法
40 print(hasattr(obj, 'power')) # 有属性'power'吗?
41 print(getattr(obj, 'power')) # 获取属性'power'
42 fn = getattr(obj, 'power') # 获取到后 赋值到一个变量
43 print(fn()) # 通过变量调取原始方法
44
45 # 使用场景
46
47 """
48 假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。
49 请注意,在Python这类动态语言中,根据鸭子类型,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。
50 """
51
52
53 def readImage(fp):
54 if hasattr(fp, 'read'):
55 return readData(fp)
56 return None
57
58
59