0
点赞
收藏
分享

微信扫一扫

五、类和对象

宁静的猫 2022-01-20 阅读 31
  1. 函数、实例方法类方法、静态方法、代码段、构造函数、析构函数、私有方法
class Person:
    # 代码段,创建类对象时调用
    print('Create a Person')

    # 构造函数__init__
    # 析构函数为__del__,一般不要使用
    def __init__(self, name):
        self.name = name # 实例属性,一般在__init__中定义

    def greet(self):
        self.age = 5  # 实例属性,一般在__init__中定义,但允许在其他地方定义
        print("Hello, world! I'm {}.".format(self.name))
        
	# 私有方法,通过在名称前加两个_实现
    def __method2(self):
        print('I have a self!')
      
    
    # (实例)方法:通过参数self关联到所属的实例
    # 可以访问 实例属性 实例方法 类属性 类方法
    # 只能用 实例 调用
    def method1(self):
        print('I have a self!')

    # 类方法:通过参数cls关联到所属的类
    # 只能访问 类属性 类方法
    # 可以通过 类和实例 调用
    @classmethod
    def cmeth(cls):
        print('This is a class method of', cls)

        
    # 静态方法:不能有cls、self,不能访问 实例属性 实例方法 类属性 类方法
    # 仅仅托管于某个类的名称空间中,便于使用和维护
    @staticmethod
    def smeth():
        print('This is a static method')


# 函数:自由函数,跟类无关,没有参数self
def function():
    print("I don't...")


if __name__ == '__main__':
    foo = Person('Luke Skywalker')
    foo.greet()

  1. 类属性和实例属性

    class MemberCounter:
        # 类属性
        # 可以使用 类 访问,也可以使用 实例 访问
        # 如果通过 实例 访问并赋值,那么 实例中的值 将隐藏 类中的值(但对于其他实例仍然不变)
        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()
        # 输出 1 1
        print(m.members)
        print(MemberCounter.members)
    
  2. 继承 重写

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

    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__()
            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.
    
  3. 抽象类

    from abc import ABC, abstractmethod
     
    class Talker(ABC):
        @abstractmethod
        def talk(self):
            pass
            
     
    
    class Knigget(Talker):
        def talk(self):
            print("Ni")
     
    >>>k = Knigget()
    
举报

相关推荐

0 条评论