当前位置: 首页 > news >正文

Python:新式类写法,多继承

新式类写法:

经典类:不由任意内置类型派生出的类:

class A:

class Person:#父类
    def eat(self):
        print("eat")
class Man(Person):#子类
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")

class A():也属于经典类

class A(object(对象,Python为所有对象提供的基类,提供一些内置的属性和方法,所有类都继承,如果一个类没有继承任何类,默认继承object类))  新式类:继承了object类或者该类的子类都是新式类,推荐使用

print(dir(object))

结果:

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

多继承:子类可以有多个父类,可以继承所有父类的属性和方法:

class Person(object):#父类
    def eat(self):
        print("eat")
class Person1(object):#第二个父类
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")
class Son(Person,Person1):
    pass
son=Son()
son.eat()
son.sing()

不同的父类存在同名的方法:开发时尽量避免这种情况:

class Person(object):#父类
    def eat(self):
        print("eat")
class Person1(object):#第二个父类
    def eat(self):
        print("eat1")#不会被继承
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")
class Son(Person,Person1):
    pass
son=Son()
son.eat()
son.sing()

class Person(object):#父类
    def eat(self):
        print("eat")
class Person1(object):#第二个父类
    def eat(self):
        print("eat1")#会被继承,因为Son类调用符合就近原则,Person1最近则被优先调用
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")
class Son(Person1,Person):
    pass
son=Son()
son.eat()
son.sing()

方法的搜索顺序(了解):__mro__:

class Person(object):#父类
    def eat(self):
        print("eat")
class Person1(object):#第二个父类
    def eat(self):
        print("eat1")
    def sing(self):#派生类,拥有不同于父类的属性
        print("sing")
class Son(Person1,Person):
    pass
son=Son()
son.eat()
son.sing()
print(Son.__mro__)

结果为:
eat1
sing
(<class '__main__.Son'>, <class '__main__.Person1'>, <class '__main__.Person'2>, <class 'object'>)

搜索方法时会先按照__mro__的输出结果从左往右的顺序查找,如果在当前类中找到方法就会直接运行不会搜索,没找到会报错

相关文章:

  • Mac:JMeter 下载+安装+环境配置(图文详细讲解)
  • Spring学习
  • 128. Longest Consecutive Sequence
  • 力扣222. 完全二叉树的节点个数(Java实现)
  • Java 生成钻石*
  • 【高项】信息系统项目管理师(八)项目质量管理【3分】
  • 主流的Java生态下权限管理框架
  • 查看linux系统信息
  • 【linux】scp和rsync
  • PHP转GO Day2 数据类型与控制结构实践(开发计算器)
  • BRAM消耗与FIFO的关系:有效利用FPGA资源的策略
  • 面试整理--一个报告生成的方案解析
  • excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果追加到json文件
  • C语言:字符串去特定字符
  • UGO和ACL
  • 从关键词到权重:TF-IDF算法解析
  • Atom of Thoughts for Markov LLM Test-Time Scaling论文解读
  • 凸集和凸函数
  • Google C++编码规范指南(含pdf)
  • python主成分分析法1
  • 最高检公布一起离婚纠纷典型案例:推动离婚经济补偿制度落实
  • 美将解除对叙利亚制裁,外交部:中方一贯反对非法单边制裁
  • 俄谈判代表团已抵达土耳其,谈判预计在莫斯科时间10时左右开始
  • 与总书记交流的上海人工智能实验室年轻人,在探索什么前沿领域?
  • 崔登荣任国家游泳队总教练
  • 气候多米诺:厄尔尼诺与东南亚跨境害虫或威胁中国粮食安全