关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

29.从入门到精通:Python3 面向对象继承 多继承 方法重写 类属性与方法

发布时间:2023-06-26 18:00:45

继承

在面向对象编程中,继承是指通过继承现有类的属性和方法来创建新类的过程。新类称为子类(或派生类),现有类称为父类(或基类)。

  • 继承可以提高代码的重用性和可扩展性,减少代码的重复。子类可以继承父类的属性和方法,还可以添加自己的属性和方法,或者重写父类的方法。

在 Python 中,继承可以通过在类定义中指定父类来实现。例如:

class Person:  def __init__(self, name, age):  self.name = name  self.age = age  def say_hello(self):  print("Hello, my name is {} and I am {} years old.".format(self.name, self.age))   class Student(Person):  def init(self, name, age, student_id):  Person.init(self, name, age)  self.student_id = student_id def say_hello(self):  Person.say_hello(self)  print("My student ID is {}.".format(self.student_id))

   

在这个示例中,我们定义了一个名为 Person 的父类和一个名为 Student 的子类。子类 Student 继承了父类 Person的属性和方法,并添加了自己的属性和方法。 在子类中,我们可以使用 super() 函数来调用父类的方法。例如,在 Student 类的 init() 方法中,我们调用了父类 Person 的 init() 方法来初始化对象的属性。 我们还重写了父类 Person 的 say_hello() 方法,并在子类 Student 的 say_hello() 方法中调用了父类的say_hello() 方法,并添加了自己的输出。

下面是一个使用 Student 类的示例:

student = Student('John', 20, '123456') student.say_hello()

   

在这个示例中,我们创建了一个名为 student 的 Student 对象,并调用了对象的 say_hello() 方法。由于Student 类继承了 Person 类的 say_hello() 方法,因此在调用子类的 say_hello() 方法时,父类的say_hello() 方法也会被调用。 希望这可以帮助您了解在 Python 中如何实现继承


多继承

多继承是指一个类可以同时继承多个父类的特性。在 Python 中,多继承可以通过在类定义时同时指定多个父类来实现。例如:

class A:  def method_a(self):  print("This is method A.")  class B:  def method_b(self):  print("This is method B.")  class C(A, B):  def method_c(self):  print("This is method C.")  c = C() c.method_a() # 输出:This is method A. c.method_b() # 输出:This is method B. c.method_c() # 输出:This is method C.

   

在上面的例子中,我们定义了三个类 A、B 和 C。类 A 和 B 分别定义了一个方法 method_a 和 method_b,类 C继承了类 A 和类 B,并且定义了一个方法 method_c。通过实例化类 C,我们可以调用所有三个方法

  • 需要注意的是,多继承可能会导致方法重名的问题。如果多个父类中都定义了同名的方法,那么在子类中调用该方法时,Python会按照一定的顺序搜索父类,直到找到第一个定义该方法的父类为止。

这个搜索顺序称为方法解析顺序(Method Resolution Order,简称 MRO),可以通过类的 mro 属性来查看。例如:

class A:  def method(self):  print("This is method A.")  class B:  def method(self):  print("This is method B.")  class C(A, B):  pass  class D(B, A):  pass  print(C.__mro__) # 输出:(,,,) print(D.__mro__) # 输出:(,,,)

   

在上面的例子中,我们定义了四个类 A、B、C 和 D。类 A 和 B 分别定义了一个方法 method,类 C 继承了类 A 和类 B,类D 继承了类 B 和类 A。通过查看类的 mro 属性,我们可以看到方法解析顺序是怎样的。在类 C 中调用 method 方法时,由于 A 在 B 前面,所以会优先调用 A 中的 method 方法。在类 D 中调用 method 方法时,由于 B 在 A 前面,所以会优先调用 B 中的 method 方法。


方法重写

在面向对象编程中,方法重写是指在子类中重新定义一个与父类中同名的方法。通过方法重写,子类可以改变继承自父类的方法的行为,从而实现自己的逻辑。方法重写也称为方法覆盖或方法复写。

在 Python 中,方法重写可以通过在子类中定义一个与父类中同名的方法来实现。例如:

class Person:  def __init__(self, name, age):  self.name = name  self.age = age   def say_hello(self):  print("Hello, my name is {} and I am {} years old.".format(self.name, self.age))  class Student(Person):  def say_hello(self):  print("Hello, my name is {} and I am a student.".format(self.name))

   

类属性与方法

类属性和类方法是指属于整个类而不是类的实例的属性和方法。类属性和类方法可以通过类名直接访问,也可以通过类的实例访问。以下是一个示例:

class Person:  # 类属性  species = "Homo sapiens"  # 实例属性 def __init__(self, name, age):  self.name = name  self.age = age  # 实例方法 def say_hello(self):  print(f"Hello, my name is {self.name} and I am {self.age} years old.")  # 类方法 @classmethod def get_species(cls):  print(f"This is a {cls.species}.")  person = Person("Alice", 25) person.say_hello() # 输出:Hello, my name is Alice and I am 25 years old. Person.get_species() # 输出:This is a Homo sapiens.

   

在上面的示例中,我们定义了一个 Person 类,包含了一个类属性 species、一个实例属性 name 和 age、一个实例方法 say_hello 和一个类方法 get_species。类属性和类方法都是通过在方法或属性前面加上 @classmethod装饰器来定义的。

类属性是属于整个类的属性,可以通过类名直接访问。在上面的示例中,我们通过 Person.species 来访问类属性 species。

类方法是属于整个类的方法,可以通过类名直接调用。在上面的示例中,我们通过 Person.get_species() 来调用类方法 get_species。需要注意的是,类方法的第一个参数通常是 cls,表示类本身。



/template/Home/leiyu/PC/Static