1 多态
多态指的是⼀类事物有多种形态,(⼀个抽象类有多个⼦类,因⽽多态的概念依赖于继承)。
- 定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果。
- 好处:调⽤灵活,有了多态,更容易编写出通⽤的代码,做出通⽤的编程,以适应需求的不断变化!
'''
通过对父类形参传入子类对象实参来实现多态
'''
class Dog():
def bark(self):
print("I\' a dog !")
class BlackDog():
def bark(self):
print("I\' a black dog !")
class WhiteDog():
def bark(self):
print("I\' a white dog !")
#参数为父类类型的引用,但实际传入为不同的子类对象
def let_dog_bark(dog):
dog.bark()
bd=BlackDog()
wd=WhiteDog()
let_dog_bark(bd)
let_dog_bark(wd)
2 类属性和实例属性
2.1 类属性
类属性类类似于静态变量,可以通过类名访问,在python中,类属性也可以通过实例方法。
- 记录的某项数据 始终保持⼀致时,则定义类属性。
- 实例属性 要求 每个对象 为其 单独开辟⼀份内存空间 来记录数据,⽽ 类属性 为全类所共有,仅占⽤⼀份内存,更加节省内存空间
在类的方法前定义变量,就完成类属性的定义。下面我们在Dog类中定义color类属性。
class Dog():
color="white"
#通过类名访问
print(Dog.color)
#通过对象访问
dog1=Dog()
print(dog1.color)
white
white
2.2 修改类属性
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了⼀个实例属性。
class Dog():
color="white"
print(Dog.color)
Dog.color="black"
print(Dog.color)
#通过实例对象修改
dog1=Dog()
dog1.color="yellow"
print(Dog.color) #可以发现类属性color并未修改
print(dog1.color) #同时的确新建了一个为yellow的类属性
white
black
black
yellow
2.3 实例属性
实例属性可以在方法中进行定义,哪怕方法中属性的名称和类属性相同,也无法调用类属性,而只是创建了一个同名的实例属性。
class Dog():
color="white"
def __init__(self):
self.color="black"
#通过类名访问
print(Dog.color)
#通过对象访问
dog1=Dog()
print(dog1.color)
white
black
3 静态⽅法
需要通过装饰器 @staticmethod 来进⾏修饰,静态⽅法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)。
静态⽅法 也能够通过 实例对象 和 类对象 去访问。
class Dog():
@staticmethod
def bark():
print("I\' a cute dog !")
Dog.bark()
I' a cute dog !