python为啥要使用继承
1. **代码复用**:子类可以继承父类的方法和属性,避免了重复编写相同的代码,提高了代码的复用性。
2. **建立层次结构**:通过继承可以清晰地表示类之间的层次关系,使代码结构更有条理。
3. **扩展和修改功能**:子类可以在父类的基础上进行扩展和修改,添加新的特性或改变某些行为。
4. **提高开发效率**:利用继承可以快速构建复杂的类体系,减少开发时间和工作量。
如何在 Python 中实现继承
- 定义子类:创建一个新的类,指定它继承自某个父类。
- 在子类中可以重写父类方法:根据需要对父类的方法进行修改或扩展。
class Parent:
def method(self):
print("这是父类的方法")
class Child(Parent):
def method(self):
print("这是子类的方法")
#Child` 类继承自 `Parent` 类,并在子类中重写了父类的方法。
super()详细解释
super()
的作用是在子类中调用父类的方法。super(_class_, <first argument>
:第一个参数是子类,第二个参数是子类实例。super(type)
:返回一个未绑定的超级对象。super(type, obj)
:返回一个绑定的超级对象,要求obj
是type
的实例。super(type, type2)
:返回一个绑定的超级对象,要求type2
是type
的子类。
class Parent:
def __init__(self):
self.attribute = "父类属性"
class Child(Parent):
def __init__(self):
super().__init__() # 调用父类的 __init__ 方法
self.child_attribute = "子类属性"
# 创建子类实例
child = Child()
print(child.attribute) # 输出: 父类属性
print(child.child_attribute) # 输出: 子类属性
父类和子类
- 如果类中不定义__init__,调用父类superclass的__init__
- 如果类继承父类也需要定义自己的__init_,就需要在当前类的__init_调用一下父类__init__
- 如何调用父类__init__:
super().init(参数)
super(类名,对象).init(参数) - 如果父类有eat(),子类也定义一个eat方法,默认搜索的原则:先找当前类,再去找父类
super().__init__()
用于在子类的__init__
方法中调用父类的__init__
方法,这样可以确保父类的初始化操作也被执行。- 然后,子类可以再进行自己的额外初始化操作,添加自己的属性。
-
如果类中不定义
__init__
,调用父类superclass
的__init__
:
在Python中,如果子类没有定义自己的__init__
方法,那么它将自动调用父类的__init__
方法。这是因为__init__
方法是一个特殊的方法,用于在创建类的新实例时初始化对象。class Parent: def __init__(self): print("Parent __init__ called") class Child(Parent): pass # 没有定义 __init__ c = Child() # 这将调用 Parent 的 __init__
-
如果类继承父类也需要定义自己的
__init__
,就需要在当前类的__init__
调用一下父类__init__
:
当子类需要执行一些额外的初始化操作时,它通常会定义自己的__init__
方法。在这种情况下,为了确保父类的初始化代码也被执行,子类应该在其__init__
方法中调用父类的__init__
方法。class Parent: def __init__(self): print("Parent __init__ called") class Child(Parent): def __init__(self): super().__init__() # 调用父类的 __init__ print("Child __init__ called") c = Child() # 这将先调用 Parent 的 __init__,然后调用 Child 的 __init__
-
如何调用父类
__init__
:- 使用
super()
来调用父类的方法。这是Python 3中推荐的方式。 super().__init__()
:这种方式不需要指定类名和对象,Python会自动处理。super(类名, self).__init__()
:这种方式在你需要明确指定类名和对象时使用,但在Python 3中不推荐使用。
class Child(Parent): def __init__(self): super().__init__() # 推荐的方式 # 或者 super(Parent, self).__init__() # 不推荐的方式
- 使用
-
如果父类有
eat()
,子类也定义一个eat
方法,默认搜索的原则:先找当前类,再去找父类:
在Python中,当调用一个方法时,会先在当前类的命名空间中查找该方法,如果找不到,再沿着继承链向上查找。class Parent: def eat(self): print("Parent is eating") class Child(Parent): def eat(self): print("Child is eating") c = Child() c.eat() # 这将调用 Child 的 eat 方法
-
override
(覆盖):
当子类提供一个与父类同名的方法时,这种行为称为方法覆盖(override)。这允许子类改变或扩展父类的行为。class Parent: def greet(self): print("Hello from Parent") class Child(Parent): def greet(self): print("Hello from Child") c = Child() c.greet() # 这将调用 Child 的 greet 方法,即使它继承自 Parent
父类提供的方法不能满足子类的需求,就需要在子类中定义一个同名的方法,这种行为:重写