python面向对象1

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

1.1__init__:

​ init是实例创建后被调用的,用以设置对象属性的初始值。依据需求看是否需要这个函数。init函数可对类进行初始化,且def之后不可以用return进行返回。

1.2__new__:

​ new是在实例创建前被调用的,创建一个实例然后返回该实例(例子中创建了string,返回一个新的str)。继承一个不可变类型但又想进行修改时使用。new函数提示开辟存储空间。new的参数会传给init方法,需要返回一个实例对象作为返回值。

1
2
3
4
5
6
7
8
class CapStr(str):
def __new__(cls, string):
string = string.upper()
return str.__new__(cls, string)


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

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

1
SDWHDWISIAD
1.3__del__:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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对象可进行的所有算术运算

算术运算

2.2重载
1
2
3
4
5
6
7
8
>>> 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方法)

1
2
3
4
5
6
7
8
9
10
>>> 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__

查看评论