python-内置函数

构造函数

__init__

作用:在对象创建时自动调用。不需要手动调用函数,常用于初始化一些变量,属性。使用内置__init__特殊方法

1
2
3
4
5
6
7
8
9
10
class A():
def __init__(self):
self.num = 30
def get_num(self):
return self.num

# B继承与A,可以重写A的init方法
class B(A):
def __init__(self):
print("have not use A's init method")

如果B是继承与A,同时又重写了A的init方法,但是其它的方法中需要用到初始化A的数据(self.num),那么必须包含初始化A的init语句,否则会报错。因为改写的B中没有这个变量

1
2
3
4
# 这样写表示在B的init方法中调用A的init方法,B中其它方法如果需要使用到self.num时就不会报错
class B(A):
def __init__(self):
A.__init__(self)

上面这种写法是2.x版本写法,3.x版本写法:

1
2
3
class B(A):
def __init__(self):
super().__init__()

使用到了super函数,而且没有使用self,优点在于有多个超类的时候只需要写一个就行。它返回一个super对象,访问其属性时,它会在所有的超类中寻找。

其他内置方法

实现序列,要求不使用get,set方法,一个对象既可以设值,也可以取值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def check_index(key):
if not isinstance(key, int):
raise TypeError
if key < 0:
raise IndexError

class mylist():
# 初始化变量,字典
def __init__(self, start=0, step=1):
self.start = start
self.step = step
self.changed = {}

# 如果只输入一个值,则查找返回值
def __getitem__(key):
check_index(key)
try:
return self.changed[key]
except:
return self.start + self.step * key

# 如果输入两个值,则为设置值
def __setitem__(key, value):
check_index(key)
self.changed[key] = value

函数property

这个函数就可以简化上面复杂的步骤,将set和get统一为一个属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Juice():
def __init__(self):
self.count = 0

def get_count(self):
return self.count

def set_count(self,num):
self.count = num

mycount = property(get_count, set_count)

c = Juice()
c.mycount

需要特别注意的是,上面代替get与set的名称不能写count,而要使用其他的名字比如mycount

因为最终我们调用函数的时候(如果写成了count)会写c.count,那么当他在执行get函数的时候,会返回一个self.count。self指代的是对象自身,那么就又返回到调用函数c.count这样就形成了递归调用。

解决方法是要么修改property封装的属性名称(mycount),要么在变量前加下划线(_count/__count)。目的就是为了不形成迭代关系。

property中的参数顺序不能错:property(get, set, del)