Python成员继承和方法的重写

文章介绍了Python中类的成员继承,包括私有属性和方法的继承,以及方法的重写概念和示例。同时,展示了如何查看类的继承层次结构(mro方法)和对象的属性(dir函数)。文章还强调了object类作为所有类的基类,以及重写__str__方法来定制对象的字符串表示的重要性。
摘要由CSDN通过智能技术生成

一、类成员的继承和重写

  1. 成员继承:子类继承了父类除构造方法之外的所有成员。

    ⚠️(私有属性、私有方法也被继承)

  2. 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”

【操作】继承和重写的案例

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

1.1、查看类的继承层次结构

通过类的方法mro()或者类的属性__mro__可以输出这个类的继承层次结构。

【操作】 查看类的继承层次结构

class A:pass
class B(A):pass
class C(B):pass
​
print(C.mro())

执行结果:

[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>] 

二、object根类

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']

从上面我们可以发现这样几个要点:

  1. Person对象增加了六个属性:

    __dict__ __module__ __weakref__ age name say_age

  2. object的所有属性,Person类作为object的子类,显然包含了所有的属性

  3. 我们打印agenamesay_age,发现say_age虽然是方法,实际上也是属性。只不过,这个属性的类型是method而已。

age <class 'int'>
name <class 'str'>
say_age <class 'method'> 

⚠️关于object这些属性的详细学习,会后面学习中逐个涉及。在此,没必要展开。

三、重写__str__()方法

  1. object有一个__str__()方法,用于返回一个对于“对象的描述”。内置函数str(对象),调用的就是__str__()
  2. __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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟之编程

您的支持将成为我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值