文章目录

  • 继承
  • 单继承
  • 多继承
  • 重写父类同名属性和方法
  • 子类调用父类同名属性和方法有顺序
  • 查看继承的顺序(不用实例化对象)
  • 调用父类方法super()
  • 类的私有属性
  • 静态方法和类方法
  • __new__方法
  • 单例模式


继承

在程序中,继承描述的是多个类之间的所属关系,如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里,那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。

单继承

也就是一个类只继承一个父类

class A():
    def __init__(self):
        self.name = 'Tom'
    def print_name(self):
        pass
class C(A,B):
    pass
b = C()
print(b.name)

多继承

也就是一个类继承多个父类

class A():
    def __init__(self):
        self.name = 'Tom'
    def print_name(self):
        pass
class B():
    def __init__(self):
        self.age = 21
    def print_name(self):
        pass
class C(A,B):
    pass
b = C()
print(b.name)

重写父类同名属性和方法

class A():
    def __init__(self):
        self.name = 'Tom'
    def print_name(self):
        pass
class B():
    def __init__(self):
        self.age = 21

    def print_name(self):
        pass
class C(A, B):
    def __init__(self):
        self.name = '芜湖'
        self.age = 20
    def print_name(self):
        # 使用父类属性之前
        print(f'C{self.name}')
        # 使用父类属性之后
        A.__init__(self)
        print(f'C{self.name}')
c = C()
c.print_name()

子类调用父类同名属性和方法有顺序

查看继承的顺序(不用实例化对象)

print(类名.__mro__)
# demo:
class A():
    def __init__(self):
        self.name = 'Tom'
    def print_name(self):
        pass
class B():
    def __init__(self):
        self.age = 21
    def print_name(self):
        pass
class C(A,B):
    def __init__(self):
        self.name= '芜湖'
        self.age = 20
    def print_name():
    	# 使用父类的方法
    	A.s
    	print('使用')
c = C()
print(c.__mro)

调用父类方法super()

class Animal(object):
    def play(self):
        print("动物都有各自的玩法")

class Cat(Animal):
    def play(self):
        Animal.play(self) #  
        super().play()    #
        print("猫喜欢玩球")

c = Cat()
c.play()

类的私有属性

在属性名和方法名 前面 加上两个下划线 __(只能在类中的属性中使用)

class A(object):
    def __init__(self):
        self.__name = 'Tom'  # 私有实例属性

    def __product(self):  # 私有实例
        pass
a = A() # 实例化对象

静态方法和类方法

类方法: 能够通过实例对象和类对象去访问
静态方法: 静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用,调用静态方法可以通过对象或者类调用

class a:
    @classmethod  # 类方法
    def pos(cls):
        pass

    @staticmethod # 静态方法
    def pos1():
        pass

__new__方法

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

 __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

 __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

单例模式

单例模式:永远用一个对象得实例,避免新建太多实例浪费资源	
实质:使用__new__方法新建类对象时先判断是否已经建立过,如果建过就使用已有的对象			

class Foo(object):
   instance = None
   def __init__(self):
      self.name = 'alex'
   def __new__(cls):
      if Foo.instance:
         return Foo.instance
      else:
         Foo.instance = object.__new__(cls)
         return Foo.instance
obj1 = Foo()
obj2 = Foo()
print(obj1,obj2