三种方法的对比
class Stu():
count=0
def __init__(self,name,age):
self.name=name
self.age=age
Stu.count+=1
def showSelf(self):#对象方法(实例方法),第一个参数是对象本身,只能被具体对象使用
print(self.name,self.age)
@classmethod
def jishu(cls):#类方法,第一个参数是类本身,通过类直接访问,也能通过对象访问
print(cls.count)
@staticmethod#静态方法,跟类和对象无太大关系,能通过类直接访问
def jisuan(a,b):
c=a+b
print(c)
zs=Stu('张三',18)
ls=Stu('李四',19)
zs.showSelf()
zs.jishu()
ls.showSelf()
ls.jishu()
Stu.jisuan(2,3)
类属性和对象属性的区别,类属性供整个类使用,对象属性供对象使用
封装:__age(双下划线),就是私有化,只能内部使用
class A():
__count=0
def __init__(self,name,age):
self.name=name
self.__age=age
def getAge(self):
return self.__age
zs=A('张三',19)
print(zs.name)
print(zs.getAge())
print(zs.__age)#不能访问,只能内部使用
eg:
class A():
def getAge(self):
return self.__age
def setAge(self,age):
if age>120 or age<0:
print('年龄设置问题')
self.__age=0
else:
self.__age=age
zs=A()
zs.setAge(19)
print(zs.getAge())##输出19
ls=A()
ls.setAge(130)
print(ls.getAge())
eg:
class A():
def setAge(self,age):
self.__age=age
def getAge(self):
return self.__age
a=A()
a.setAge(19)
print(a.getAge())##19
a.__age=29##重新赋值了,没有调用了封装
print(a.__age)###29
print(a.getAge())#19
print(a._A__age)#19,访问私有属性
print(a.__dict__)#生成字典
继承:子类可以调用父类的方法
class People():
def chifan(self):
print('我在吃饭')
class Shuijiao(People):
def shuijiao(self):
print('我在睡觉')
zs=Shuijiao()
zs.shuijiao()#
zs.chifan()#调用父类的方法
调用继承例子
class Animal():
def __init__(self,name,gender,age):
self.name=name
self.age=age
self.gender=gender
def chifan(self):
print(self.name,'吃饭')
def shuijiao(self):
print(self.name,'睡觉')
def jiao(self):#overriding重载,父类被重载
print('哈哈')
class Cat(Animal):
def jiao(self):
print('喵喵')
class Dog(Animal):
def jiao(self):
print('汪汪')
d=Dog('旺财','公',3)
d.chifan()
d.shuijiao()
d.jiao()#当子类和父类有重名方法时,优先使用子类的方法
print(Dog.__bases__)#查看Dog继承的父类,如果一个类没有继承任何类,默认继承object
c=Cat('波斯猫','母',2)
c.chifan()
c.shuijiao()
c.jiao()
#重载
class Animal():
def __init__(self,name,gender,age):
self.name=name
self.age=age
self.gender=gender
def chifan(self):
print(self.name,'吃饭')
def shuijiao(self):
print(self.name,'睡觉')
def jiao(self):#overriding重载,父类被重载
print('哈哈')
class Cat(Animal):
def jiao(self):
super().jiao()##继承父类的jiao方法
print('喵喵')
class Dog(Animal):
def jiao(self):
super().jiao()##继承父类的jiao方法
print('汪汪')
d=Dog('旺财','公',3)
d.chifan()
d.shuijiao()
d.jiao()#当子类和父类有重名方法时,优先使用子类的方法
print(Dog.__bases__)#查看Dog继承的父类,如果一个类没有继承任何类,默认继承object
c=Cat('波斯猫','母',2)
c.chifan()
c.shuijiao()
c.jiao()
eg:
class Human():
def __init__(self,name,sex):
self.name=name
self.sex=sex
def showSelf(self):
print(self.name,self.sex)
class Man(Human):
def __init__(self,name,sex,salary):
super().__init__(name,sex)#继承父类的init
self.salary=salary
def showSelf(self):
super().showSelf()#继承父类的showSelf
print(self.salary)
class Women(Human):
def __init__(self,name,sex,huafei):
super().__init__(name,sex)#继承父类的init
self.huafei=huafei
def showSelf(self):
super().showSelf()#继承父类的showSelf
print(self.huafei)
zs=Man('张三','男',10000)
ls=Women('李四','女',2000)
zs.showSelf()
ls.showSelf()
eg:
class A():
def __init__(self,x):
self.x=x
class B(A):
def __init__(self,x,y):#当B中有init时,则调用B中的init,当B中没有时,则调用A中的
self.x=x
self.y=y
def showSelf(self):
print(self.x)
b=B(1,2)
b.showSelf()
eg:
class A():
def __init__(self,x,y):
self.x=x
self.y=y
class B(A):
def __init__(self,x,y,z):
super().__init__(x,y)
self.z=z
def showSelf(self):
print(self.x)
b=B(1,2,3)
print(b.x,b.y,b.z)
eg:
class A():
count=0
class B():
pass
print(A.count)
A.hello=120#外属性赋值,如果类属性中含有,则改变值,没有的话则赋值
print(A.hello)
#私有属性
class A():
__x=100
def __init__(self,name,age):
self.name=name
self.__age=age
class B(A):
def __init__(self,name,age,sex):
super().__init__(name,age)
self.sex=sex
def showSelf(self):
print(self.name,self.__age,self.sex)
b=B('张三',19,'男')
b.showSelf()#无法输出,因为是私有属性
print(B.__x)#无法输出,是私有属性
调用父类的num
class A():
num=3
class B(A):
num=4
b=B()
print(B.num)#子类中有num,则用自己的,输出4
print(super(B,b).num)#调用父类的num
多继承
eg1
class A():
def t1(self):
print('t1')
class B():
def b1(self):
print('b1')
class C(A,B):
def c1(self):
print('c1')
c=C()
c.t1()
c.c1()
c.b1()
eg2
class A():
def t1(self):
print('t1')
def t2(self):
print('t2')
class B():
def t1(self):
print('b1')
def t2(self):
print('b2')
class C(A,B):
def c3(self):
print('c3')
c=C()
c.t1()#输出为t1,#当父类有多个相同方法或者属性时,调用顺序为C,A,B,跟父类顺序有关
print(C.mro())#顺序为C-A-B-object
eg3:
class B():
def __init__(self):
print('B开始')
print('B结束')
class C():
def __init__(self):
print('C开始')
print('C结束')
class D(B,C):
def __init__(self):
print('D开始')
super().__init__()#只继承了一个B父类
print('D结束')
d=D()#D开始,B开始,B结束,D结束
钻石继承
class A():
def __init__(self):
print('A开始')
print('A结束')
class B(A):
def __init__(self):
print('B开始')
super().__init__()
print('B结束')
class C(A):
def __init__(self):
print('C开始')
super().__init__()
print('C结束')
class D(B,C):
def __init__(self):
print('D开始')
super().__init__()#广度为D-B-C-A-object
print('D结束')
d=D()
eg4:
class A():
def func(self):
print('A')
class B(A):
def func(self):
super().func()
print('B')
class C(A):
def func(self):
super().func()
print('C')
class D(B,C):
def func(self):
super().func()
print('D')
d=D()##类的顺序应该是D-B-C-A,结果为A-C-B-D
d.func()
多态
class Dog():
def jiao(self):
print('汪汪')
class Cat():
def jiao(self):
print('喵喵')
class Pig():
def jiao(self):
print('哼哼')
def han(x):
x.jiao()
d=Dog()
c=Cat()
p=Pig()
a=[]
a.append(d)
a.append(c)
a.append(p)
for x in a:
han(x)
多态
class Pay():
def pay(self):
pass
class ALpay(Pay):
def pay(self,money):
print('阿里支付',money)
class WeiXinpay(Pay):
def pay(self,money):
print('微信支付',money)
class Person():
def pay(self,obj,money):
obj.pay(money)
w=WeiXinpay()
a=ALpay()
zs=Person()
zs.pay(a,100)##ALpay().pay(100)
zs.pay(w,200)
作业
class Dog(object):
def __init__(self,name):
self.name=name
def game(self):
print('%s蹦蹦跳跳的玩耍。。。'%self.name)
class XiaoTianDog(Dog):
def game(self):
print('%s飞到天上玩耍'%self.name)
class Person(object):
def __init__(self,name):
self.name=name
def game_with_dog(self,dog):
print('%s和%s快乐的玩耍。。。。'%(self.name,dog.name))
dog.game()
xt_dog=XiaoTianDog('哮天犬')
els=Person('二郎神')
els.game_with_dog(xt_dog)