19.5.6笔记and作业

三种方法的对比

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值