封装是面向对象编程的一个基本概念,它将数据(属性)和操作这些数据的方法(函数)绑定在一起,形成一个类,同时将一些实现细节隐藏起来,只暴露出必要的接口。封装有助于数据的保护和隐藏,避免外部代码直接访问和修改对象的内部状态,从而增加代码的安全性和可维护性。
封装的主要目的是:数据隐藏,控制访问,代码模块化,增加代码的灵活性。
而其中通过定义公开(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_varobj = 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_valueelse:raise ValueError("Value must be positive")@value.deleter # deleter方法def value(self):del self.__valueobj = 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 = attributedef 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_attributedef child_method(self):print("This is a method in the child class")
class Parent:passclass Child(Parent):pass
class Parent1:passclass Parent2:passclass Child(Parent1, Parent2):pass
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
class Parent:def __init__(self, name):self.name = nameclass Child(Parent):def __init__(self, name, age):super().__init__(name) # 调用父类的构造函数self.age = agechild = Child("Alice", 30)print(child.name) # 输出: Aliceprint(child.age) # 输出: 30
多态是面向对象编程(OOP)的一个重要特性,它允许对象以多种形式出现。在Python中,多态性通过继承和方法重写实现,使得同一个方法在不同的对象上可以有不同的行为。多态性提高了代码的灵活性和可扩展性。
-
方法重写(Overriding): -
子类可以重写父类的方法,即在子类中定义与父类同名的方法。这样,当子类对象调用该方法时,会执行子类的方法,而不是父类的方法。
-
-
动态绑定(Dynamic Binding): -
方法调用在运行时绑定到具体的实现上,这意味着调用哪个方法是在运行时决定的,而不是在编译时决定的。
-
-
接口一致性: -
多态性要求子类实现父类的方法接口(方法签名一致),从而保证子类对象可以在任何父类对象可出现的地方使用。
-
class Shape(ABC):@abstractmethoddef area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef 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