函数在创建时有一些内置的方法,特殊情况下会使用到。一般被称为魔法方法
在此之前先记录一下类的进阶方法:
一、继承
class Fish():
def __init__(self):
self.x = random.randint(0,10) def hello(self): print("Hello! I am a fish!I'm gonging to{}".format(self.x-1)) class Shark(Fish):
def __init__(self):
super().__init__()
self.y = random.randint(0,10) def eat(self): print("鲨鱼吃各种鱼,还有一个y轴属性,我在y={}".format(self.y))
这样子的话如果shark1 = Shark() 我们调用shark1.hello() 会怎样呢?
shark1 = Shark()
shark1.hello()
>>Hello! I am a fish!I'm going to 4
※ 注意这里我们用super().__init__() 来继承父类的初始化方法(init)
※ 一般继承是一对一的,尽量不使用多继承,但是有时候需要多继承:例如飞机继承于交通工具,但是又有“飞”的特殊属性,我们创建四轴飞行器,飞机,直升机类的时候都单独写一个飞属性,那么代码的复用性就太差了。这时候可以用
class PlaneMixin: def fly(self): print("I'm flying!")
用Mixin来增加一个功能,这个类只作为功能添加
●不能作为父类,不能使某个物品。
●必须责任单一,如果有多个功能就写多个Mixin类
●它不依赖于子类的实现
●子类即使没有继承这个Mixin类也可以照常工作,只是没有了这个功能。
★python3里的类都是新式类,继承的时候是广度遍历(深度遍历后将重复的项删掉,只保留最后一个,也就相当于广度遍历) 顺序可以用 类.__mro__查询
二、组合
把没有关系的类放在一起就是组合,可以放在新的类里面一起初始化。
class Turtle: def __init__(self, x): self.num = x class Fish: def __init__(self,y): self.num = y class Pool: def __init__(self, x, y): self.turtle = Turtle(x) self.fish = Fish(y) def print_num(self): print("水池里有{}乌龟,{}条鱼".format(self.turtle.num, self.fish.num)) pool1 = Pool(5,7) pool1.print_num() >> 水池里有5乌龟,7条鱼
三、类A,类对象A(),实例化对象a = A()
查询类里面所有的字段可以用A.__dict__
但是实例化对象如果没有填参数就查询不到,例如a.__dict__就是空的
四、内置函数(bif)
1、issubclass,查询前面的类是否是后面类的子类,默认自己是自己的子类,所有的类都是object类的子类
class A: pass class B(A): pass print(issubclass(B, A)) >>>True
2、isinstance, 检查一个实例化对象是不是属于一个类,第二个参数可以传入一个元组(里面有多个候选类) 【如果第二个参数不是由类组成,会抛出一个TypeError的异常】
b1 = B() print(isinstance(b1, B)) >>>True print(isinstance(b1, A)) >>>True
print(isinstance(b1, (A, B, C)))
>>>True
# 这里B是继承自A的所以b1也是A的实例化对象
3、hasattr(object, name) 测试一个对象里面是否有指定的属性,attr是attribute的缩写,属性的意思
class C: def __init__(self, x=0): self.x = x c1 = C() print(hasattr(c1, 'x')) # 这里属性名是字符串
>>> True
4、getattr(object, name[, default]) 获得一个对象里面的指定属性的值(默认值),也可以通过default来设定返回值
class C: def __init__(self, x=0): self.x = x c1 = C() print(getattr(c1, 'x')) # 返回0 print(getattr(c1, 'y', None)) # 没有返回默认值None,(这里的default是位置参数,不能写成key=None形式)
5、 setattr(object, name, value) 给一个属性赋值,例如上面没有‘y’属性,可以给它设定上一个y属性
setattr(c1, 'y', 'NewValue') getattr(c1, 'y') >>> 'NewValue'
6、delattr(object, name) 删除一个属性
五、魔法方法,property
property赋值给x后,可以通过x来调用属性,里面前三个参数分别是:获取属性的方法,设置属性的方法,删除属性的方法
class C: def __init__(self, size=10): self.size = size def get_size(self): return self.size def set_size(self, value): self.size = value return '设置成功' def del_size(self): del self.size x = property(get_size, set_size, del_size) '''property参数:fget=None,fset=None,fdel=None,doc=None''' c1 = C() print(c1.get_size()) print(c1.x) c1.x = 19 print(c1.x) print(c1.get_size()) del c1.x print(c1.get_size()) ''' 10 10 19 19 Traceback (most recent call last): File "C:/Users/wqk/Desktop/OnlinePay/Pay/test_2.py", line 26, in <module> print(c1.get_size()) File "C:/Users/wqk/Desktop/OnlinePay/Pay/test_2.py", line 7, in get_size return self.size AttributeError: 'C' object has no attribute 'size' '''