面向对象编程

昨天学习了面向对象编程中的实例属性和实例方法,类变量和类方法,静态方法。下面继续学习面向对象编程的封装(Encapsulation),继承(Inheritance),多态(Polymorphism)。
封装(Encapsulation)

封装是面向对象编程的一个基本概念,它将数据(属性)和操作这些数据的方法(函数)绑定在一起,形成一个类,同时将一些实现细节隐藏起来,只暴露出必要的接口。封装有助于数据的保护和隐藏,避免外部代码直接访问和修改对象的内部状态,从而增加代码的安全性和可维护性。

封装的主要目的是:数据隐藏,控制访问,代码模块化,增加代码的灵活性。

而其中通过定义公开(public)、受保护(protected)和私有(private)属性和方法,可以控制哪些部分可以被外部访问,哪些部分只能被内部访问。

公开成员(public):默认情况下,所有的属性和方法都是公有的,可以被外部代码访问,不需要加任何前缀,

class MyClass:    def __init__(self):        self.public_var = "I am public"        def public_method(self):        return "This is a public method"
obj = MyClass()print(obj.public_var)  # 输出: I am publicprint(obj.public_method())  # 输出: This is a public method

受保护(protected):受保护成员以单个下划线_开头,表示不建议外部代码直接访问,但仍然可以访问。

class MyClass:    def __init__(self):        self._protected_var = "I am protected"        def _protected_method(self):        return "This is a protected method"
obj = MyClass()print(obj._protected_var)  # 输出: I am protectedprint(obj._protected_method())  # 输出: This is a protected method

私有(private):私有成员以双下划线__开头,用于强制数据隐藏。私有成员在类外部不能直接访问。

class MyClass:    def __init__(self):        self.__private_var = "I am private"        def __private_method(self):        return "This is a private method"        def get_private_var(self):        return self.__private_var
obj = MyClass()# print(obj.__private_var)  # 这会引发 AttributeErrorprint(obj.get_private_var())  # 输出: I am private

属性方法(Property)

属性方法是一种用于封装数据的技术,它允许我们使用方法来访问属性,同时保持与访问普通属性相同的语法。使用@property装饰器,可以将方法转换为属性。

class MyClass:    def __init__(self, value):        self.__value = value        @property  # getter方法    def value(self):        return self.__value        @value.setter  # setter方法    def value(self, new_value):        if new_value > 0:            self.__value = new_value        else:            raise ValueError("Value must be positive")        @value.deleter  # deleter方法    def value(self):        del self.__value
obj = MyClass(10)print(obj.value)  # 输出: 10obj.value = 20print(obj.value)  # 输出: 20# obj.value = -10  # 这会引发 ValueErrordel obj.value# print(obj.value)  # 这会引发 AttributeError

继承(Inheritance)

继承是面向对象编程(OOP)的一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码重用和扩展。通过继承,子类不仅可以拥有父类的所有特性,还可以添加自己的特性或重写父类的特性。

父类(基类/超类):提供继承的类,父类包含子类可以继承的属性和方法。

子类(派生类):继承父类的类,子类可以继承父类的属性和方法,并且可以添加新的属性和方法,或者重新父类的方法

class ParentClass:    def __init__(self, attribute):        self.attribute = attribute
    def parent_method(self):        print("This is a method in the parent class")
class ChildClass(ParentClass):    def __init__(self, attribute, child_attribute):        super().__init__(attribute)  # 调用父类的构造函数        self.child_attribute = child_attribute
    def child_method(self):        print("This is a method in the child class")
其中继承的类型可以是单继承和多重继承。
单继承:一个子类只继承一个父类。
class Parent:    pass
class Child(Parent):    pass
多重继承:一个子类继承多个父类,只方法在编制中较为复杂,需要谨慎使用。
class Parent1:    pass
class Parent2:    pass
class Child(Parent1, Parent2):    pass
特别讲一下方法重写(Overriding
子类可以重写(override)父类的方法,即在子类中定义与父类同名的方法。这样,当子类对象调用该方法时,会执行子类的方法,而不是父类的方法。
class Parent:    def speak(self):        return "Hello from Parent"
class Child(Parent):    def speak(self):        return "Hello from Child"
child = Child()print(child.speak())  # 输出: Hello from Child
使用‘super()’函数
super()函数用于调用父类的方法,特别是在重写父类方法时,常用于调用父类的构造函数。
class Parent:    def __init__(self, name):        self.name = name
class Child(Parent):    def __init__(self, name, age):        super().__init__(name)  # 调用父类的构造函数        self.age = age
child = Child("Alice", 30)print(child.name)  # 输出: Aliceprint(child.age)   # 输出: 30
多态(Polymorphism)

多态是面向对象编程(OOP)的一个重要特性,它允许对象以多种形式出现。在Python中,多态性通过继承和方法重写实现,使得同一个方法在不同的对象上可以有不同的行为。多态性提高了代码的灵活性和可扩展性。

  1. 方法重写(Overriding):
    • 子类可以重写父类的方法,即在子类中定义与父类同名的方法。这样,当子类对象调用该方法时,会执行子类的方法,而不是父类的方法。
  2. 动态绑定(Dynamic Binding):
    • 方法调用在运行时绑定到具体的实现上,这意味着调用哪个方法是在运行时决定的,而不是在编译时决定的。
  3. 接口一致性:
    • 多态性要求子类实现父类的方法接口(方法签名一致),从而保证子类对象可以在任何父类对象可出现的地方使用。
class Shape(ABC):    @abstractmethod    def area(self):        pass
class Circle(Shape):    def __init__(self, radius):        self.radius = radius
    def area(self):        return 3.14 * self.radius ** 2
class Rectangle(Shape):    def __init__(self, width, height):        self.width = width        self.height = height
    def area(self):        return self.width * self.height
# 使用多态性def print_area(shape):    print(f"The area is: {shape.area()}")
circle = Circle(5)rectangle = Rectangle(4, 6)
print_area(circle)     # 输出: The area is: 78.5print_area(rectangle)  # 输出: The area is: 24

 

学习python最快的方法就是在实际中运用起来。

原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/82855.html

(0)
速盾高防cdn's avatar速盾高防cdn
上一篇 2024年5月31日 下午5:19
下一篇 2024年5月31日 下午5:23

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注