类方法
class Student():
count = 0
def __init__(self,name):
self.name=name
Student.count+=1
def say(self):
print("你好,我叫",self.name,sep="")
@classmethod #想定义类方法必须用@classmethod
def hanshu(cls): #类方法、第一个参数一定是类本身
print(cls.count)
print(Student.count)
@staticmethod #静态
def hanshu2():
print("和Student没关系")
zs = Student("张三")
zs.say()
Student.hanshu()
Student.hanshu2()
结果为:
魔术删除类
程序执行过后,删除项会自动删除。
class Student():
count = 0
def __init__(self,name):
self.name=name
Student.count+=1
def __del__(self):
Student.count-=1
print("删除了",self.name,"还剩下",Student.count)
zs = Student("张三")
ls = Student("李四")
ww = Student("王五")
del zs
del ls
del ww
结果为:
str函数魔术
class Student():
count = 0
def __init__(self, name, age):
self.name = name
self.age = age
Student.count += 1
def __str__(self):
return "我叫%s,今年%d岁。"%(self.name,self.age)
zs = Student("张三",19)
ls = Student("李四",20)
ww = Student("王五",21)
sentence=str(zs) #str函数,启动了类中str的魔术方法
print(sentence)
print(hasattr(Student,"count"))
print(not hasattr(Student,"inst")) #查找类中是否含有此属性(hasattr含有属性)
Student.inst = 9999
print(hasattr(Student,"inst"))
结果为:
eq-----等于
class A():
def __init__(self,num):
self.num=num
def __eq__(self, other): #等于
return self.num == other.num
def __add__(self, other): #加法
return self.num + other.num
x = A(5)
y = A(5)
print(x==y)
print(x is y)
print(x+y)
结果为:True False 10
单例模式
class Car():
def __new__(cls, *args, **kwargs): #单例模式
if not hasattr(Car,"hehe"): #如果 类没有hehe属性
cls.hehe=object.__new__(cls) #生成了一个新的对象给类属性hehe
return cls.hehe
def __init__(self,name):
self.name=name
a = Car("奔驰")
b = Car("宝马")
c = Car("红旗")
print(a.name)
print(a==c)
print(a is c)
结果为:红旗 True True
广度优先级
class A():
def __init__(self):
print("A开始")
print("A结束")
class B(A):
def __init__(self):
print("B开始")
super().__init__()
print("B结束")
class E(A):
def __init__(self):
print("E开始")
super().__init__()
print("E结束")
class C(A):
def __init__(self):
print("C开始")
super().__init__()
print("C结束")
class D(B,C,E): #B,C处于同一层次,先B后C相继输出
def __init__(self):
print("D开始")
super().__init__()
print("D结束")
d = D()
print(D.mro())
结果为:
观察者模式
class LaoBan():
def __init__(self):
self.guanChaZheMen=[]
self.ZhuangTai=""
def fuJia(self,observer):
self.guanChaZheMen.append(observer)
def tongZhi(self):
for d in self.guanChaZheMen:
d.update()
class Oberser():
def __init__(self,name,laoban):
self.name=name
self.laoban=laoban
def update(self):
print("%s请注意,不要玩了,%s"%(self.name,self.laoban.ZhuangTai))
class Caiwu():
def __init__(self,name,laoban):
self.name=name
self.laoban=laoban
def update(self):
print("%s请注意,不要睡觉了,%s"%(self.name,self.laoban.ZhuangTai))
tony = LaoBan()
zs = Oberser("张三",tony)
ls = Oberser("李四",tony)
ww = Oberser("王五",tony)
xd = Caiwu("熊大",tony)
xe = Caiwu("熊二",tony)
tony.fuJia(zs)
tony.fuJia(ls)
tony.fuJia(ww)
tony.fuJia(xd)
tony.fuJia(xe)
tony.ZhuangTai="老板来了!"
tony.tongZhi()
结果为:
策略模式
class XianJin():
def shou_qian(self,money):
return money
class DaZhe():
def __init__(self,zheKou):
self.zheKou=zheKou
def shou_qian(self,money):
return money * self.zheKou
class ManJian():
def __init__(self,tiaojian,jian_e):
self.tiaojian=tiaojian
self.jian_e=jian_e
def shou_qian(self,money):
return money - money // self.tiaojian * self.jian_e
class ZongGuan():
def __init__(self,celue):
self.celue = celue
def qiuQian(self,money):
return self.celue.shou_qian(money)
a={}
a[1]=ZongGuan(XianJin())
a[2]=ZongGuan(DaZhe(0.8))
a[3]=ZongGuan(ManJian(300,50))
celue=int(input("请输入策略:"))
qian=float(input("请输入钱:"))
if celue in a.keys():
money=a[celue].qiuQian(qian)
else:
money=a[1].qiuQian(qian)
print(money)
结果为:
工厂模式
class Benz():
def __init__(self,name):
self.name=name
def pao(self):
print("%s在跑"%self.name)
class BMW():
def __init__(self,name):
self.name=name
def pao(self):
print("%s在跑"%self.name)
class GongChang():
@staticmethod
def ZhiZaoChe(name):
if name=="奔驰":
return Benz(name)
elif name=="宝马":
return BMW(name)
car1=GongChang.ZhiZaoChe("奔驰")
car2=GongChang.ZhiZaoChe("宝马")
car1.pao()
car2.pao()
结果为: