成员继承:子类继承了父类除构造方法之外的所有成员。
⚠️(私有属性、私有方法也被继承)
方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”
【操作】继承和重写的案例
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):
Person.__init__(self,name,age)
self.score = score
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_name()
s1.say_age()
执行结果:
张三 的分数是: 85
报告老师,我是 张三
张三 的年龄是: 15
通过类的方法mro()
或者类的属性__mro__
可以输出这个类的继承层次结构。
【操作】 查看类的继承层次结构
class A:pass
class B(A):pass
class C(B):pass
print(C.mro())
执行结果:
[, , , ]
object
类是所有类的父类,因此所有的类都有object
类的属性和方法。我们显然有必要深入研究一下object
类的结构。对于我们继续深入学习Python很有好处。
2.1、dir()
查看对象属性为了深入学习对象,先学习内置函数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()
print(dir(obj))
s2 = Person("高淇",18)
print(dir(s2))
运行结果:
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'say_age']
从上面我们可以发现这样几个要点:
Person
对象增加了六个属性:
__dict__
__module__
__weakref__
age
name
say_age
object
的所有属性,Person
类作为object
的子类,显然包含了所有的属性
我们打印age
、name
、say_age
,发现say_age
虽然是方法,实际上也是属性。只不过,这个属性的类型是method
而已。
age
name
say_age
⚠️关于object这些属性的详细学习,会后面学习中逐个涉及。在此,没必要展开。
__str__()
方法object
有一个__str__()
方法,用于返回一个对于“对象的描述”。内置函数str(对象)
,调用的就是__str__()
__str__()
经常用于print()
方法,帮助我们查看对象的信息。__str__()
可以重写class Person:
def __init__(self,name,age):
self.name = name
self.__age = age
def __str__(self):
'''将对象转化成一个字符串,一般用于print方法'''
print("重写__str__方法")
return "名字是:{0},年龄是{1}".format(self.name,self.__age)
p = Person("高淇",18)
print(p)
s = str(p)