1 python类重载运算符init和str
1.1 类方法实现重载
python表达式和内置类型的运算流程是通过类的实例对象来控制的。
所以,自定义类也可以实现内置类型的运算符。
运算符重载:通过类方法实现内置类型的运算,比如:打印、加法、切片等。
python运算符重载让对象接口更一致,更具兼容性。
| NO | 知识点 | 描述 |
|---|---|---|
| 1 | X | 用双下化线命名类方法。每个方法对应一种内置运算符。 |
| 2 | 自动调用 | 对象使用内置运算符时,会自动调用对应的方法。 |
| 3 | 触发异常 | 类未实现内置运算符对应方法时,调用运算符会引发异常。 |
1.2 init()
python的__init__()为构造函数,对应内置运算符为小括号()。
所以,类调用小括号()创建实例对象时会自动调用__init__()构造方法。
用法
class 类名([父类1,...]):
def __init__(self[,value]):
[self.data = value]
pass
描述
python通过构造函数__init__()重载小括号的调用,完成实例对象的初始化。
| NO | 场景 | 类创建实例对象时 |
|---|---|---|
| 1 | 类有init,父类有init | 先自动调用本类__init__()方法 |
| 2 | 类有init,父类无init | 先自动调用本类__init__()方法 |
| 3 | 类无init,父类有init | 先自动调用父类__init__()方法 |
| 4 | 类无init,父类无init | 无任何操作,直接创建实例对象 |
| 5 | 创建实例对象传参数 | 根据__init__()方法传参数 |
文件
E**:\documents\F盘\testclass.**py
class MyClassA:
def setData(self,value):
self.data = value
def display(self):
print('display.self.data={}={}'.format(self.data,self))
class MyClassB(MyClassA):
def __init__(self,value):
print('{}调用MyClassB.__init__'.format(value))
self.data = value
class MyClassC(MyClassB):
def __init__(self,value):
print('{}调用MyClassC.__init__'.format(value))
self.data = value
class MyClassD(MyClassC):
pass
class MyClassE(MyClassA):
pass
if __name__ == '__main__':
# 无init,直接创建实例
a1 = MyClassA()
a1.setData('a1')#未使用init,实例对象后额外设置data
a1.display()
try:
#__init__有入参,创建实例对象必传
MyClassB()
except Exception as e:
print('MyClassB():{}'.format(e))
# 类有init父类无init,自动调用本类init,根据init传参数
b1 = MyClassB('b1')#使用init,在创建实例对象时自动设置data,完成对象初始化
b1.display()
# 类有init父类有init,自动调用本类init
c1 = MyClassC('c1')
# 类无init父类有init,自动调用父类init
d1 = MyClassD('d1')
# 类无init父类无init,直接创建实例
e1 = MyClassE()
示例
# 打开cmd,执行下面示例
E:\documents\F盘>python testclass.py
display.self.data=a1=<__main__.MyClassA object at 0x010EADD0>
MyClassB():__init__() missing 1 required positional argument: 'value'
b1调用MyClassB.__init__
display.self.data=b1=<__main__.MyClassB object at 0x010EAD50>
c1调用MyClassC.__init__
d1调用MyClassC.__init__
1.3 str()
用法
class 类名([父类1,...]):
def __str__(self):
return 返回值
pass
描述
(1) python的__str__()用于重载print()。
(2) str()需有返回值,且为字符串。
(3) str()重载后,调用print()时需传实例对象。
a) 实例对象赋值给self
b) 打印__str__()返回值
(4) 重载__str__()不用额外编写和调用特殊的打印方法。只需调用print()即可。
文件
E**:\documents\F盘\testclass.**py
class MyClassA():
def __init__(self,name,age):
self.name = name
self.age = age
class MyClassB(MyClassA):
def __str__(self):
return '姓名:{},年龄:{}'.format(self.name,self.age)
if __name__ == '__main__':
a1 = MyClassA('tyxt','16')
print(a1)#未重载__str__时,默认打印
b1 = MyClassB('梯阅线条','18')
print(b1)#重载__str__后,调用类的__str__方法
示例
# 打开cmd,执行下面示例
E:\documents\F盘>python testclass.py
<__main__.MyClassA object at 0x01538A30>
姓名:梯阅线条,年龄:18
2 END
本文首发微信公众号:梯阅线条,
更多内容参考python知识分享或软件测试开发目录。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




