在 Python 中访问父类属性
Accessing parent class attributes in Python
要访问子类中的父类属性:
- 使用该
super()
方法在子级中调用父级的构造函数。 - 该
__init__()
方法将设置实例变量。 - 访问
self
对象上父类的任何属性或方法。
主程序
class Employee(): cls_id = 'emp-cls' def __init__(self, name): self.salary = 100 self.name = name class Developer(Employee): def __init__(self, name): # 👇️ invoke parent __init__() method super().__init__(name) # 👇️ accessing parent instance variable print(self.salary) # 👉️ 100 # 👇️ accessing parent class variable print(self.cls_id) # 👉️ emp-cls d1 = Developer('bobbyhadz') print(d1.salary) # 👉️ 100 print(d1.cls_id) # 👉️ 'emp-cls'
代码片段显示了如何从子类访问父类变量和父实例变量。
该cls_id
属性是一个类变量。
可以直接在子类或子类本身的实例上访问类变量。
主程序
class Employee(): cls_id = 'emp-cls' class Developer(Employee): def __init__(self, name): # 👇️ accessing parent class variable print(self.cls_id) # 👉️ emp-cls d1 = Developer('bobbyhadz') print(d1.cls_id) # 👉️ 'emp-cls' print(Developer.cls_id) # 👉️ 'emp-cls'
要访问父实例变量,调用类的构造方法来运行父__init__()
方法中的代码。
主程序
class Employee(): def __init__(self, name): self.salary = 100 self.name = name class Developer(Employee): def __init__(self, name): # 👇️ call parent __init__() method super().__init__(name) print(self.salary) # 👉️ 100 d1 = Developer('bobbyhadz') print(d1.salary) # 👉️ 100
该super()
方法使我们无需显式引用即可访问基类。
我们可以将对的调用替换为super()
以Employee
达到相同的结果。
主程序
class Employee(): def __init__(self, name): self.salary = 100 self.name = name class Developer(Employee): def __init__(self, name): Employee.__init__(self, name) print(self.salary) # 👉️ 100 d1 = Developer('bobbyhadz') print(d1.salary) # 👉️ 100
但是,
super()
比显式引用基类更灵活、更常用。对父__init__
方法的调用运行该方法并将
salary
和name
属性分配给实例。
现在我们可以访问子类实例的父类salary
和name
属性。
示例中的类假设需要一个name
参数。
这是相同的示例,但是在实例化子类时没有传递任何参数。
主程序
class Employee(): def __init__(self): self.salary = 100 class Developer(Employee): def __init__(self): super().__init__() print(self.salary) # 👉️ 100 d1 = Developer() print(d1.salary) # 👉️ 100
一旦父__init__()
方法中的代码运行,实例就会被分配一个salary
属性,可以在self
对象上访问该属性。
您可以使用相同的方法从子类访问父类中定义的方法。
主程序
class Employee(): def __init__(self, name): self.salary = 100 self.name = name def greet(self): print(f'Hello {self.name}') class Developer(Employee): def __init__(self, name): super().__init__(name) print(self.salary) # 👉️ 100 self.greet() # 👉️ Hello bobbyhadz d1 = Developer('bobbyhadz') print(d1.salary) # 👉️ 100 d1.greet() # 👉️ Hello bobbyhadz
父级定义了greet()
子实例可以通过self
对象访问的方法。