面向对象之__init__方法、super()方法

96 阅读2分钟

1.__init__方法

1.1 介绍

__init__方法是 Python 中面向对象编程中类的特殊方法,也称为构造方法,当创建一个类的实例时,__init__方法会自动调用。

self参数是必须的,它代表创建的对象本身,在方法内部可以通过self来引用对象的属性和方法。除了self以外的其他参数是可选的,根据实际需求定义。

1.2 示例代码

class HttpRequest(object):
    # 
    def __init__(self, name, age):
        self.name = name
        self.age = age


request = HttpRequest('小杨', 19)

request.city = "北京"

print(request.name)  # 输出结果为:小杨
print(request.age)  # 输出结果为:
print(request.city)  # 输出结果为:北京

1.3 注意事项

  • __init__方法在对象创建时自动调用,无需手动调用。
  • __init__方法可以接收任意数量的参数,但必须遵循特定的参数签名。
  • __init__方法中,必须给对象的每一个属性赋值,否则该对象将不完整,不能正常工作。
  • 可以在__init__方法中调用其他方法,但请注意不要在初始化的过程中产生太多的计算,因为这可能会影响程序的性能。
  • 一个类可以没有__init__方法,在这种情况下,程序将以默认方式创建该类的对象。

2.super()方法

2.1 综述

根据类的【继承关系】,逐步往上找,并不是单纯找父类中的方法;

2.2 示例代码一

class Base:
    def f1(self):
        print("Base")

class Foo(Base):
	pass

class Bar(Foo):
    def f1(self):
        print("Bar")
        super().f1()

obj = Bar()
obj.f1()  # 执行结果为:[Bar,Base]

2.3 示例代码二

class Base:
    def f1(self):
        print("Base")

class Foo:
    def f1(self):
        print("Foo")        
        
class Bar(Foo,Base):
    def f1(self):
        print("Bar")
        super().f1()
        
obj = Bar()
obj.f1()  # 执行结果为[Bar,Foo]

2.4 示例代码三

class Base:
    def f1(self):
        print("Base")

class Foo:
    def f1(self):
        print("Foo")
        super().f1()
        
class Bar(Foo,Base):
    def f1(self):
        print("Bar")
        super().f1()
        
obj = Bar()
obj.f1()  #执行结果为: [Bar,Foo,Base]

2.5 示例代码四


class Base:
    def f1(self):
        print("Base")

class Foo:
    def f1(self):
        print("Foo")
        super().f1()
        
class Bar(Foo,Base):
    def f1(self):
        print("Bar")
        super().f1()
        
obj = Foo()
obj.f1()    # 代码报错,因为Foo父类为object,没有f1方法

3.__init__和super的用法

3.1 示例代码

class Parent:
    def __init__(self, value1, value2):
        self.value1 = value1
        self.value2 = value2


class Child(Parent):
    def __init__(self, value1, value2, value3):
        super().__init__(value1, value2)
        self.value3 = value3


obj = Child('v1', 'v2', 'v3')
print(obj.value1)  # 输出结果为v1
print(obj.value2)  # 输出结果为v2
print(obj.value3)  # 输出结果为v3

3.2 说明

在上述示例中,Child继承了Parent的所有属性,并且在其中添加了额外的value3 属性。调用 super().__init__(value1, value2) 可以访问父类的__init__方法,并将其初始化为value1 和value2。