面向对象的三大特性
封装
1、把属性封装到对象当中,方便调用。
2、把相同的功能封装到同一方法当中,方便调用。
继承
1、python顶级父类是object。
2、如果不同类中有相同的行为或属性,这个时候我们就要考虑用继承。
3、减少代码,实现代码复用。
4、具有传递性。
5、当父类的行为满足不了子类的行为时,就需要重写。
6、私有属性和私有方法是继承不过来的。
多态
1、同一种事物具有多种形态
2、多态的前提是有继承关系
3、调用同一种行为产生了不同的结果
单例模式:
不管创建多少个对象,在内存中只有唯一的对象。
class Animal(object):#父类 == 基类
def __init__(self):
self.name = '动物'
def eat(self):
print('吃东西')
def play(self):
print('玩')
class Dog(Animal):#子类 == 派生类
__instance = None #装对象的引用
__init_flag = False
def __new__(cls, *args, **kwargs):#创建对象
#创建对象的逻辑
if cls.__instance is None:
cls.__instance = super().__new__(cls)#用父类的方法创建对象
return cls.__instance#ID不变
#多线程创建时会有问题
else:
return cls.__instance
def __init__(self,name):
if not Dog.__init_flag:
self.name = name
Dog.__init_flag = True#只认第一次输入的名字
def play(self):
print('狂奔')
class Cat(Animal):#子类
def eat(self):#重写父类的方法
print('吃鱼')
super().eat()#调用父类方法
class Bear(Animal):#子类
def play(self):
print('抓鱼')
class Person(Animal):
def play_with_animal(self,animal):
animal.play()#多态
person = Person()
bear = Bear()
dog = Dog('哈士奇')
cat = Cat()
cat.eat()
person.play_with_animal(dog)#填bear结果会不同