文章目录
- 继承
- 单继承
- 多继承
- 重写父类同名属性和方法
- 子类调用父类同名属性和方法有顺序
- 查看继承的顺序(不用实例化对象)
- 调用父类方法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