My python learning

时间:2021-2-20 作者:admin

2.17 面向对象编程

1.学习了面向对象编程中的一些基础函数

1.1__init__:
init是实例创建后被调用的,用以设置对象属性的初始值。依据需求看是否需要这个函数。init函数可对类进行初始化,且def之后不可以用return进行返回。
1.2__new__:
new是在实例创建前被调用的,创建一个实例然后返回该实例(例子中创建了string,返回一个新的str)。继承一个不可变类型但又想进行修改时使用。new函数提示开辟存储空间。new的参数会传给init方法,需要返回一个实例对象作为返回值。

class CapStr(str):
    def __new__(cls, string):
        string = string.upper()
        return str.__new__(cls, string)


a = CapStr('sdwhdwisiad')
print(a)

CapStr继承了str,由于str不可修改,故用new方法进行修改。结果是

SDWHDWISIAD

1.3__del__:
当实例化对象消失(copy的版本被删掉时不会被调用)的时候会调用del方法。(在pycharm里运行例子时,由于执行后就被删掉了所以既打印了init方法也打印了del方法,在idle环境下不存在这个问题)

>>> class A:
...     def __init__(self):
...             print('got')
...     def __del__(self):
...             print('dismiss')
...
>>> a1 = A()
got
>>> a2 = a1
>>> a3 = a2
>>> del a3
>>> del a2
>>> del a1
dismiss

2.算数运算与其重载(重载就是重新定义算术运算)

2.1对象可进行的所有算术运算
My python learning
2.2重载

>>> class New_int(int):
...     def __add__(self,other):
...             return int.__sub__(self,other)
...
>>> a = New_int(5)
>>> b = New_int(9)
>>> a + b
-4

将原来的加法add方法重载为了减法。(若将加法定义为加法则会产生递归,超过了最大递归层次就会报错)
当当前运算不能正常进行时,自动调用其反运算(如add不行则会调用radd方法)

>>> class Nint(int):
...     def __radd__(self,other):
...             return int.__sub__(self,other)
...
>>> a = Nint(5)
>>> b = Nint(3)
>>> a + b
8
>>> 1 + b
2

例中,a,b是同一类型,相加时自动调用__add__方法进行相加,而1与b不是同一类型,无法相加,会自动调用radd方法,即我们已经定义了的方法。(因为b属于class Nint,所以self参数是b,other参数是1)
类似还有增量赋值运算,形式为__iadd__

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。