__str__()
__repr__()
__len__()
str() 转字符串
repr() 让字符原形毕露的方法
len() 计算长度
内置的方法很多,但是并不是全部都在object中,比如len(),__len__(),比如说数字,时间,还有对象都是无法计算长度
1 # __del__ 析构函数
2 # 删除,python解释器本身也会自动删除
3 class A:
4 def __del__(self):
5 print("执行我啦")
6 a = A()
7 # del a # 这里不些括号也行
8 del(a) # 即删除了变量,又执行了这个方法,先执行后删除
9 # 执行我啦
10 print(a) # NameError: name 'a' is not defined
__call__() 调用的本质
__str__() 把一个类的示例变成字符串输出(其实是为了输出给客户看的.更加的容易清晰的理解这个实例是个啥)
1 class ABC():
2 def __init__(self,name):
3 self.name = name
4
5 def aaa(self):
6 print(f"{self.name} is aaa")
7 return "aaa"
8
9 def __call__(self, *args, **kwargs):
10 print("it's working~~")
11
12 def __str__(self):
13 print("这是一个ABC的实例") # __str__返回值必须要有. 不然会报错.
14 # TypeError: __str__ returned non-string (type NoneType)
15 return "这是一个ABC的实例"
16
17 a = ABC("yangtuo") # 实例化
18
19 # 直接对实例操作实际是操作的就是__call__()方法
20 a() # it's working~~
21
22 # 在没有__call__方法的时候直接打印这个实例会返回一段内存地址
23 # print(a) # <__main__.ABC object at 0x000000000258D240>
24 # 存在__call__方法的时候返回不会这么死板
25 print(a) # 这是一个ABC的实例
26
27 a.aaa() # yangtuo is aaa
28 print(a.name) # yangtuo
内置函数类方法和内置的函数方法其实有很深的联系
简单来说就是: 开发者看 repr 客户看 str
为了保证一致性可以用只重写__str__()并设置__repr__ = __str__,就可以保证上面使用方法的结果都是调用重写的__str__()。
1 >>> class Test():
2 def __init__(self):
3 self.prompt = "hello,zss041962"
4
5 >>> t = Test()
6 >>> t
7 <__main__.Test object at 0x0000000002F3EF28>
8 >>> print(t)
9 <__main__.Test object at 0x0000000002F3EF28>
10
11 # 看到了么?上面打印类对象并不是很友好,显示的是对象的内存地址
12 # 下面我们重构下该类的__repr__以及__str__,看看它们俩有啥区别
13
14 >>> #重构__repr__
15 >>> class TestRepr(Test):
16 def __repr__(self):
17 return "Show:%s"%self.prompt
18 # 重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了
19 >>> t1 = TestRepr()
20 >>> t1
21 Show:hello,zss041962
22 >>> print(t1)
23 Show:hello,zss041962
24
25
26 >>> #重构__str__
27 >>> class TestStr(Test):
28 def __str__(self):
29 return "Show: %s"%self.prompt
30 # 你会发现,直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了
31 >>> t2 = TestStr()
32 >>> t2
33 <__main__.TestStr object at 0x00000000031C33C8>
34 >>> print(t2)
35 Show: hello,zss041962
isinstance 检查一个对象是不是一个类的对象
issubclass 检查一个一个类是不是另一个类的子类
1 # isinstance 检查一个对象是不是一个类的对象
2 # isinstance(obj,cls)
3 class A():pass
4 a = A()
5 print(isinstance(a,A)) # True
6
7
8 # issubclass 检查一个一个类是不是另一个类的子类
9 # issubclass(sub,super)
10 class A():pass
11 class B(A):pass
12 print(issubclass(B,A)) # True
13 # 这个顺序有点难记忆, B是不是A 的子类?是就返回 T 不是返回 F
14 # 被检查是否是子类的放在前面
15 # 被检查是否是父类的放在后面