天天看点

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知识分享或软件测试开发目录。