python 面向对象02
面向对象三大特性:封装、继承、多态
封装:隐藏实现细节,对外提供方法调用
继承:代码的重用性
多态:同一个方法,不同实例对象调用,结果不一样
python 支持多继承(一个类,有多个父类)
说明:当不同的父类中出现同名方法时,识别靠前类中的方法。
所有类默认继承:object 类
定义子类时,必须调用父类的构造函数。
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def say_age(self):
print(self.name, "的年龄是:", self.__age)
class Student(Person):
def __init__(self, name, age, score):
self.score = score
Person.__init__(self, name, age) # 构造函数中包含调用父类构
s1 = Student("张三", 15, 85)
s1.say_age()
print(dir(s1))
继承
子类继承父类所有成员(继承了并不一定能用)
重写
特:重写是在继承的基础之上。没有类之间的继承关系,就没有重写。
重写定义:父类中的方法,子类在调用时发现,无法满足子类需求,子类对该方法进行了重新定义。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_age(self):
print(self.name, "的年龄是:", self.age)
def say_name(self):
print("我是", self.name)
class Student(Person):
def __init__(self, name, age, score):
self.score = score
Person.__init__(self, name, age) # 构造函数中包含调用父类构造函数
def say_score(self):
print(self.name, "的分数是:", self.score)
def say_name(self): # 重写父类的方法
print("报告老师,我是", self.name)
s1 = Student("张三", 15, 85)
s1.say_score()
s1.say_age()
s1.say_name() # 关注该方法调用,输出的结果
类的继承结构
类.mro()
dir() 查看对象属性
自定义类跟object类对比
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_age(self):
print(self.name, "的年龄是:", self.age)
obj = object() # 语法里面是定义了object 类的
print(dir(obj))
s2 = Person("高淇", 18)
print(dir(s2))
重写__str__()方法
class Person:
def __init__(self, name, age):
self.name = name
self.__age = age
def __str__(self):
return "名字是:{0},年龄是{1}".format(self.name, self.__age)
p = Person("高淇", 18)
print(p)
super()
class A:
def say(self):
print("A: ", self)
print("say AAA")
class B(A):
def say(self):
super().say() # 通过 super()调用父类的方法
print("say BBB")
b = B()
b.say()
多态
方法被不同对象调用结果不同
class Animal:
def shout(self):
print("动物叫了一声")
class Dog(Animal):
def shout(self):
print("小狗,汪汪汪")
class Cat(Animal):
def shout(self):
print("小猫,喵喵喵")
def animalShout(a):
if isinstance(a, Animal):
a.shout()
animalShout(Dog())
animalShout(Cat())