五、类和对象

  1. 函数、代码段、构造函数、析构函数、实例方法类方法、静态方法、私有方法

    # 函数:自由函数,跟类无关
    def function():
        print('This is 函数')
    
    
    # 类内的函数:
    #     1)self    实例方法,若以__开始不以__结束则为私有方法
    #     2)@classmethod + cls  类方法,@classmethod可以省略但pycharm会给予警告
    #     3)@staticmethod   静态方法,如无@staticmethod则必须移出类称为自由函数
    class Person:
        # 代码段,只要所在py文件被import就会执行,且整个程序运行过程只执行一次
        print('This is 代码段')
    
        # 构造函数__init__  析构函数__del__(一般不要使用)
        def __init__(self, name):
            print('This is 构造函数')
            self.name = name  # 实例属性,一般在__init__中定义
    
        # (实例)方法:通过参数self关联到所属的实例
        # 可以访问 实例属性 实例方法 类属性 类方法
        # 只能用 实例 调用
        def greet(self):
            print('This is 实例方法')
            self.age = 5  # 实例属性,一般在__init__中定义,但允许在其他地方定义
    
        # 类方法:通过参数cls关联到所属的类
        # 只能访问 类属性 类方法
        # 可以通过 类和实例 调用
        @classmethod
        def cmeth(cls):
            print(f'This is 类方法 {cls}')
    
        # 静态方法:不能有cls、self,不能访问 实例属性 实例方法 类属性 类方法
        # 仅仅托管于某个类的名称空间中,便于使用和维护
        @staticmethod
        def smeth():
            print('This is a static method')
    
        # 私有方法,通过在名称前加两个_实现,若在后面也加称为__private_method__,则不是私有方法
        def __private_method(self):
            print('I have a self!')
    
    
  2. 类属性和实例属性

    class MemberCounter:
        # 类属性,只要所在py文件被import就会创建,且整个程序运行过程只执行一次
        # 可以使用 类 访问,也可以使用 实例 访问
        # 如果通过 实例 访问并赋值,那么 实例中的值 将隐藏 类中的值(但对于其他实例仍然不变)
        members = 0
     
        def init(self):
            MemberCounter.members += 1
     
    if __name__ == '__main__':
     
        m1 = MemberCounter()
        m1.init()
        # 输出 1 1
        print(m1.members)
        print(MemberCounter.members)
        m2 = MemberCounter()
        m2.init()
        # 输出 2 2 2
        print(m1.members)
        print(m2.members)
        print(MemberCounter.members)
     
        m1.members = "aaa"
        # 输出 aaa 2 2
        print(m1.members)
        print(m2.members)
        print(MemberCounter.members)
    
    class MemberCounter:
        # 类属性
        members = 0
     
        def init(self):
            # 定义 实例属性members,与类属性members不是一个
            # 有了这个members之后,上面的类属性members只能通过类名访问
            self.members = "bbb"
     
    if __name__ == '__main__':
     
        m = MemberCounter()
        m.init()
        # 输出 bbb 0
        print(m.members)
        print(MemberCounter.members)
    
  3. 继承 重写

    继承需要调用父类的构造方法

    class Bird:
        def __init__(self):
            self.hungry = True
        def eat(self):
            if self.hungry:
                print('Aaaah ...')
                self.hungry = False
            else:
                print('No, thanks!')
     
    class SongBird(Bird):
        def __init__(self):
            self.sound = 'Squawk!'
        def sing(self):
            print(self.sound)
    
    >>>sb = SongBird()
    # 将出现错误,因为父类Bird的初始化方法没有被调用,实例属性hungry没有被初始化
    >>>sb.eat()
    
    # 解决方案1(在较老的python版本中使用)
    class SongBird(Bird):
        def __init__(self):
            Bird.__init__(self)
            self.sound = 'Squawk!'
        def sing(self):
            print(self.sound)
    
    # 解决方案2(推荐,在新的python版本中使用)
    class SongBird(Bird):
        def __init__(self):
            super().__init__()
            # 或者super(SongBird, self).__init__()
            self.sound = 'Squawk!'
        def sing(self):
            print(self.sound)
    
    #继承并重写hello方法
    class A:
        def hello(self):
            print("Hello, I'm A.")
     
    class B(A):
        def hello(self):
            print("Hello, I'm B.")
     
    >>>a = A()
    >>>b = B()
    >>>a.hello()
    Hello, I'm A.
    >>>b.hello()
    Hello, I'm B.
    
  4. 抽象类

    from abc import ABC, abstractmethod
     
    class Talker(ABC):
        @abstractmethod
        def talk(self):
            pass
            
    
    class Knigget(Talker):
        def talk(self):
            print("Ni")
     
    >>>k = Knigget()
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MallocLu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值