python基础班第十三课

这节Python基础课程讲解了面向对象编程的重要概念,包括使用property装饰器、继承以避免代码冗余,方法的重写通过super()函数,以及多重继承的策略。还探讨了多态作为面向对象的三大特性之一,以及静态方法在属性和方法中的应用。

python基础班第十三课

上次没讲的property装饰器

在这里插入图片描述

class Person():
    def __init__(self,name):
        self._name = name
    @property
    def name(self): # get查询方法
        print('get方法执行了')
        return self._name

p =Person('哈哈')
print(p.name())

在这里插入图片描述

class Person():
    def __init__(self,name):
        self._name = name
    @property
    def name(self): # get查询方法
        print('get方法执行了')
        return self._name

p =Person('哈哈')
print(p.name())

在这里插入图片描述
此时就可以使用p.name就可以调用属性值了

class Person():
    def __init__(self,name):
        self._name = name
    @property   # 不用加括号就可以调用属性了
    def name(self): # get查询方法
        print('get方法执行了')
        return self._name

p =Person('哈哈')
print(p.name)

在这里插入图片描述

class Person():
    def __init__(self,name):
        self._name = name
    @property  # 不用加括号就可以调用属性了
    # 只读属性不能更改
    # getter方式用@property来写
    def name(self): # get查询方法
        print('get方法执行了')
        return self._name

p =Person('哈哈')
print(p.name)
p.name ='嘻嘻' #此时重新赋值不能修改了
print(p.name)

在这里插入图片描述

class Person():
    def __init__(self,name):
        self._name = name
    @property  # 不用加括号就可以调用属性了
    # 只读属性不能更改
    # getter这里用@property来书写
    def name(self): # get查询方法
        print('get方法执行了')
        return self._name
    @name.setter
    # setter这里property装饰器用 属性值.setter来书写
    def name(self,name):
        self._name = name

p =Person('哈哈')
print(p.name)
p.name ='嘻嘻'
print(p.name)

在这里插入图片描述

1.继承

在这里插入图片描述

继承 多次重复代码会冗余 继承可以避免这种情况出现

# 继承 多次重复代码会冗余 继承可以避免这种情况出现
class Doctor():
    name = ''
    age = ''

    def protect(self):
        print('保家卫国')

class Police():
    name = ''
    age = ''

    def protect(self):
        print('保家卫国')
class Animal:
    def sleep(self):
        print('动物会睡觉')
    @property
    def run(self):
        print('动物会跑步')

# 继承书写方式:
class Dog(Animal): # 括号里的类就是当前累的父类(超类)
    pass

dog =Dog()
dog.run # 有property就不用括号了

在这里插入图片描述

如果不用property装饰器:

class Animal: # 继承的话父类有私有属性(单下划线)子类也有
    def sleep(self):
        print('动物会睡觉')
    
    def run(self):
        print('动物会跑步')

# 继承书写方式:
class Dog(Animal): # 括号里的类就是当前累的父类(超类)
    pass

dog =Dog()
dog.run()

在这里插入图片描述

# issubclass 检测一个类是不是另一个类的父类
print(issubclass(Dog,Animal))
print(issubclass(Animal,object))  # 任何类嘴大父类都是object类

在这里插入图片描述

class Animal(object): # 不写括号,写了括号,写了括号和object都是继承object也都能运行
    def sleep(self):
        print('动物会睡觉')

    def run(self):
        print('动物会跑步')

# 继承书写方式: 继承的话父类有私有属性(单下划线)子类也有
class Dog(Animal): # 括号里的类就是当前累的父类(超类)
    def run(self):
        print('狗会跑步') # 这里有就用这里的,否则就找父类以此类推直到找到object,一直找不到就报错 就叫方法的重写(覆盖)

dog =Dog()
dog.run()

在这里插入图片描述

2.方法的重写

在这里插入图片描述

class A(object):
    def text(self):
        print('A')

class B(A):
    pass


class C(B):
    pass

c =C()
c.text()

在这里插入图片描述

class A(object): # 这里也找不到就报错
    pass
    # def text(self):
    #     pass
    #     # print('A')


class B(A):
    pass


class C(B):
    pass

c =C()
c.text()

在这里插入图片描述

class A(object):
    def text(self):
        print('A')


class B(A): # B 有的话直接用B的方法
    def text(self):
        print('B')


class C(B):
    pass

c =C()
c.text()

在这里插入图片描述
在这里插入图片描述

super()两种方法书写:(上一级的父类)

1.super().方法()

2.父类.方法(self)

class Dog(Animal): # 括号里的类就是当前累的父类(超类)
    def run(self):
        super().run() # 用super().方法()可以用回父类的方法
        print('狗会跑步')

dog =Dog()
dog.run()
dog.sleep()

在这里插入图片描述

class Dog(Animal): # 括号里的类就是当前累的父类(超类)
    def run(self):
        # super().run() # 用super()可以用回父类的方法
        Animal.run(self) # 通常可以用这种 父类.方法(self)
        print('狗会跑步')

dog =Dog()
dog.run()
dog.sleep()

在这里插入图片描述

3.多重继承 通常要解耦合,尽量避免多重继承

在这里插入图片描述

# 多重继承 前面覆盖后面,A B同名方法的时候,采用前面的父类方法 覆盖后来的 
class A(object):
    def text(self):
        print('A')


class B(object):
    def text(self):
        print('B')


class C(A,B):
    pass

c =C()
c.text()

在这里插入图片描述

# 多重继承 在多个父类不同名方法的时候都使用,就同时出现多个方法
class A(object):
    def text(self):
        print('A')


class B(object):
    def text(self):
        print('B')

    def text2(self):
        print('text2')


class C(A,B):
    pass

c =C()
c.text()
c.text2()

在这里插入图片描述

# 查看方法用了什么父类 用__bases__
print(C.__bases__)

在这里插入图片描述

4.多态

在这里插入图片描述

面向对象

三大特性 封装(getter,setter等) 继承(父类子类) 多态

class A(object):
    def __init__(self,name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self,name):
        self._name = name

class B(object):
    def __init__(self,name):
        self._name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name


a = A('哈哈')
b = B('嘻嘻')


def speak(c):# 当有了共同的方法(name)就都会出现
    print('好好学习% s'% c.name)


speak(a)
speak(b)

在这里插入图片描述

class Duck(object):
    def fly(self):
        print('鸭子飞')


class Plane(object):
    def fly(self):
        print('飞机飞')

def fei(obj): # 有了共同的fly方法就会出现,obj是形参
    obj.fly()

duck =Duck()
fei(duck)
plane =Plane()
fei(plane)

在这里插入图片描述

5.属性和方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 类属性
class A(object):
    # 类属性 直接定义在类中的属性
    # 类属性可以通过类和类的实例来访问
    # 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
    num = 0

    
a =A()
# 实例属性 只能通过该实例对象(a)来访问,无法通过类属性(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10

a.num =10

print(a.num)
print(A.num)

在这里插入图片描述

# 类属性
class A(object):
    # 类属性 直接定义在类中的属性
    # 类属性可以通过类和类的实例来访问
    # 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
    # num = 0 没有类属性 print的话会报错


a =A()
# 实例属性 只能通过该实例对象(a)来访问,无法通过类对象(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
a.num =10

print(a.num)
print(A.num)

在这里插入图片描述

# 类属性
class A(object):
    # 类属性 直接定义在类中的属性
    # 类属性可以通过类和类的实例来访问
    # 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
    # num = 0
    def __init__(self,name): # 这个是实例属性,参照上面的例子
        self.name = name

    def text(self):
        print('text方法')


a =A(10)# 因为有init需要一个name
# 实例属性 只能通过该实例对象(a)来访问,无法通过类属性(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
# a.num =10

# print(a.num)
# print(A.num)
# 实例方法
a.text()
A.text(a)

在这里插入图片描述

# 类属性
class A(object):
    # 类属性 直接定义在类中的属性
    # 类属性可以通过类和类的实例来访问
    # 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
    # num = 0
    def __init__(self,name): # 这个是实例属性,参照上面的例子
        self.name = name

    def text(self):
        print('text方法')

    @classmethod
    def text1(cls):
        print('text2方法')



a =A(10)# 因为有init需要一个name
# 实例属性 只能通过该实例对象(a)来访问,无法通过类属性(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
# a.num =10

# print(a.num)
# print(A.num)
# 实例方法
a.text()
A.text(a) #类要用到实例方法需要在括号中添加实例对象
# 类方法
# 类方法可以通过该类对象来调用也可以通过该实例对象调用
# cls是第一个参数,也是当前的类对象
a.text1()
A.text1()
# 总结 类当中所拥有的一切,实例对象都能拥有

在这里插入图片描述

静态方法

# 类属性
class A(object):
    # 类属性 直接定义在类中的属性
    # 类属性可以通过类和类的实例来访问
    # 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
    # num = 0
    def __init__(self,name): # 这个是实例属性,参照上面的例子
        self.name = name

    def text(self):# 这个也是实例属性
        print('text方法')

    @classmethod
    def text1(cls):
        print('text2方法')


    @staticmethod
    def text2():
        print('这是text2静态方法')




a =A(10)# 因为有init需要一个name
# 实例属性 只能通过该实例对象(a)来访问,无法通过类属性(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
# a.num =10

# print(a.num)
# print(A.num)
# 实例方法
a.text()
A.text(a) #类要用到实例方法需要在括号中添加实例对象
# 类方法
# 类方法可以通过该类对象来调用也可以通过该实例对象调用
# cls是第一个参数,也是当前的类对象
a.text1()
A.text1()
# 总结 类当中所拥有的一切,实例对象都能拥有

# 静态方法 在类中用@staticmethod来装饰的就是静态方法
# 静态方法和类无关系,不需要不需要指定任何参数,静态方法实例和对象都能使用
a.text2()
A.text2()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值