【python学习】python中类的继承和内建函数

中国史之【少康中兴】:
少康是夏朝的第六代天子,其父相被敌对的寒浞(zhuo)派人所杀,其最终替父报仇并复国成功。少康中兴是中国历史上首个出现以“中兴”二字命名的时代。
-来源:全历史APP

今天讲python中类的继承和内建函数。有需要的也可以直接去我的github查看全部笔记:
https://github.com/JackKoLing/python_notes_with_ten_days
在这里插入图片描述
俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。对于环境的配置,可以参考以下两篇:

1 类的继承

  • 继承描述了父类的属性如何“遗传”给派生类
  • 子类可以继承它的父类的任何属性,包括数据属性和方法
  • 一个未指定父类的类,其默认有一个名为object的父类
  • python允许多重继承,也就是可以有多个父类
  • 在创建子类时,只需在类名后跟一个或从其中派生的父类
class ParentClass(object):
    gender = 'Male'
    def __init__(self, who):
        self.name = who

class ChildClass(ParentClass):
    def displayInfo(self):
        print(self.gender, self.name)

x = ChildClass('jackko') # 自动继承父类的属性和方法
x.displayInfo()
>>>
Male jackko
print(dir(ParentClass))
>>>
['__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__', 'gender']
print(dir(ChildClass)) # 可以看到子类已经继承了父类的属性和方法
>>>
['__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__', 'displayInfo', 'gender']

2 类的继承和属性搜索

  • python中可以使用“obj.attribute”来获取属性,但此表达式会启动搜索连续的树
  • 创建类的实例时,实例会自动连接到创建了此实例的一个或多个类
  • 类连接到父类的方式是:将父类列在类头部的括号内,其从左至右的顺序会决定树中的次序
  • 搜索是由下至上,由左到右(python支持多重继承)
  • 如:p2继承自p1,当创建p2的实例时,会先搜索p2的属性,若找不到,再去找p1的属性

3 继承方法专用化

  • 继承会先在子类寻找变量名,然后才查找父类。因此,子类可以对父类的属性重新定义,来取代继承而来的行为
  • 子类可以完全取代从父类继承而来的属性
  • 子类也可以通过已覆盖的方法回调父类来扩展超类的方法
# 子类覆盖了父类的方法
class ParClass(object):
    def setInfo(self, sex='Male'):
        self.gender = sex

class ChiClass(ParClass):
    # 覆盖父类的方法
    def setInfo(self, who):
        self.name = who

x = ChiClass()
x.setInfo('jackko')
print(x.name)
# print(x.gender) # AttributeError: 'ChiClass' object has no attribute 'gender',因为子类覆盖了父类
>>>
jackko
# 子类通过回调扩展父类的方法
class ParClass(object):
    def setInfo(self, sex='Male'):
        self.gender = sex

class ChiClass(ParClass):
    # 覆盖父类的方法
    def setInfo(self, who):
        self.name = who
        ParClass.setInfo(self) # 回调父类的方法,把实例名通过self传给父类

x = ChiClass()
x.setInfo('jackko')
print(x.name)
print(x.gender)
>>>
jackko
Male

4 类、实例和其他对象的内建函数

# 判断一个类是否是另一个类的子类
print(issubclass(ChiClass, ParClass))
>>>
True

# 判断一个对象是否是另一个类的实例
print(isinstance(x, ChiClass))
>>>
True

# 判断一个对象是否拥有指定的属性
print(hasattr(x, 'name'))
>>>
True

# 获取一个对象的指定属性,也能删除一个属性delattr()
print(getattr(x, 'name'))
>>>
jackko
# 设置一个对象的指定属性
print(getattr(x, 'name'))
print(setattr(x, 'name', 'anney')) # 没有返回值
print(getattr(x, 'name'))
>>>
jackko
None
anney

super()

  • 在子类中找出其父类以便于调用其属性
  • 一般情况下仅能采用非绑定方式调用祖先类方法
  • 而super()可用于传入实例或类型对象
  • 语法是在__init__(self)内写super(类名, self).init()

【声明】:学习笔记基于互联网上各种学习资源的个人整理。

以上是本期内容,下期介绍python中运算符重载和可调用对象。

我叫小保,一名计算机视觉爱好者、学习者、追随者,欢迎关注我一起学习。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JackkoLing

感谢你的支持

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

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

打赏作者

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

抵扣说明:

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

余额充值