封装是面向对象编程的一个基本概念,它将数据(属性)和操作这些数据的方法(函数)绑定在一起,形成一个类,同时将一些实现细节隐藏起来,只暴露出必要的接口。封装有助于数据的保护和隐藏,避免外部代码直接访问和修改对象的内部状态,从而增加代码的安全性和可维护性。
封装的主要目的是:数据隐藏,控制访问,代码模块化,增加代码的灵活性。
而其中通过定义公开(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 public
print(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 protected
print(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) # 这会引发 AttributeError
print(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) # 输出: 10
obj.value = 20
print(obj.value) # 输出: 20
# obj.value = -10 # 这会引发 ValueError
del 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
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 = name
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) # 调用父类的构造函数
self.age = age
child = Child("Alice", 30)
print(child.name) # 输出: Alice
print(child.age) # 输出: 30
多态是面向对象编程(OOP)的一个重要特性,它允许对象以多种形式出现。在Python中,多态性通过继承和方法重写实现,使得同一个方法在不同的对象上可以有不同的行为。多态性提高了代码的灵活性和可扩展性。
-
方法重写(Overriding): -
子类可以重写父类的方法,即在子类中定义与父类同名的方法。这样,当子类对象调用该方法时,会执行子类的方法,而不是父类的方法。
-
-
动态绑定(Dynamic Binding): -
方法调用在运行时绑定到具体的实现上,这意味着调用哪个方法是在运行时决定的,而不是在编译时决定的。
-
-
接口一致性: -
多态性要求子类实现父类的方法接口(方法签名一致),从而保证子类对象可以在任何父类对象可出现的地方使用。
-
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.5
print_area(rectangle) # 输出: The area is: 24
学习python最快的方法就是在实际中运用起来。
原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/82855.html