python面向对象的继承-组合-02 (2)

代码案例

# 子类访问父类中的属性 class Parent: text = 'abc' @staticmethod def say_something(): print("anything") class Sub(Parent): def show_info(self): # # 方式一: python2 和 3 都兼容 print(super(Sub, self).text) super(Sub, self).say_something() # # # 方式二:python 3 中的语法 *** 推荐 print(super().text) super().say_something() # # # 方式三:没啥意义,不是继承,指名道姓的调用 print(Parent.text) Parent.say_something() pass s = Sub() s.show_info() # ----- 方式一 # abc # anything # ----- 方式二 # abc # anything # ----- 方式三 # abc # anything 强调点

​ 如果子类继承了一个现有的类,并且覆盖了父类的__init__方法时,那么必须在__init__方法中的第一行必须调用父类中的__init__方法,并传入父类所需的参数。 --- 这是重点 ---

上面案例改版(没有调用父类的__init__方法,父类可能没有初始化完成,后续可能会导致一些意想不到的问题)

class Person: def __init__(self, name, gender, age): self.name = name self.gender = gender self.age = age self.say_hello() # 初始化时要调用的函数 def say_hi(self): print(f"name:{self.name},gender:{self.gender},age:{self.age}") def say_hello(self): print(f"Hello, i'm {self.name}") class Student: def __init__(self, name, gender, age, number): self.name = name self.gender = gender self.age = age self.number = number def say_hi(self): print(f"name:{self.name},gender:{self.gender},age:{self.age}") print(f"number:{self.number}") # 上述代码优点冗余,怎么简化? class Student2(Person): def __init__(self, name, gender, age, number): super().__init__(name, gender, age) # 不调用父类的__init__方法就会使父类的初始化函数中的say_hello方法,初始化就不能算是完成 *** self.number = number def say_hi(self): super().say_hi() print(f"number:{self.number}") stu = Student2("rose", 'female', 18, 'young1') # Hello, i'm rose stu.say_hi() # name:rose,gender:female,age:18 # number:young1 组合

组合:# 也是一种关系,描述的是两个对象之间是什么有什么的关系,将一个对象作为另一个对象的属性(即什么有什么)

例如:学生有手机、游戏中的角色拥有某些装备

组合无处不在,数据类型、函数都是对象,都有组合

组合的目的:# 重用现有代码

# 让学生使用手机打电话、发短信 class Phone: def __init__(self, price, kind, color): self.price = price self.kind = kind self.color = color @staticmethod def call(): print("正在呼叫xxx...") @staticmethod def send_msg(): print("正在发送....") class Student: def __init__(self, name, gender): self.name = name self.gender = gender def show_info(self): print(f"name:{self.name}, gender:{self.gender}") # 让学生拥有打电话这个功能(有联系) stu1 = Student('rose', 'female') phone1 = Phone(1888, 'vivo', 'red') phone1.call() # 正在呼叫xxx... # 组合:把一个对象作为另一个对象的属性 class Student2: def __init__(self, name, gender, phone): self.name = name self.gender = gender self.phone = phone def show_info(self): print(f"name:{self.name}, gender:{self.gender}") phone2 = Phone(1888, 'vivo', 'red') stu2 = Student2('rose', 'female', phone2) stu2.phone.call() # 正在呼叫xxx... stu2.phone.send_msg() # 正在发送.... 组合与继承的取舍 ''' 继承:分析两个类的关系,到底是不是:什么是什么的关系 组合:如果两个类之间,没有太大的关系,完全不属于同类 另外:组合相比继承,耦合度更低 ''' 菱形继承(了解)

多继承带来的问题:python支持多继承,虽然灵活,但会带来名称冲突的问题(到底找谁的)

新式类与经典类

python3 中任何类都是直接或间接继承自object

新式类:任何显式或隐式地继承自object的类就称之为新式类(即python3 中的类全是新式类)

经典类:不是object的子类,仅在python2 中出现

扩展

# 在python2 中可能有这样子的代码 class Person(object): # 默认让python2 中的类也是新式类,兼容写法 pass mro列表(只在python3 中有)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyjdw.html