当我们尝试设计一个类时,我们需要考虑到类的封装性。在Python中,类的封装性可以通过访问修饰符来强制体现。访问修饰符包括public、protected和private,用来约束类中的属性和方法的访问范围。
public属性和方法
在Python中,所有没有在属性和方法名前加上双下划线的属性和方法都是公有的,也就是说,它们可以在类的外部被访问。例如,我们定义了一个Person类:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print("Hello, my name is", self.name, "and I am", self.age, "years old.")
在这个类中,我们定义了一个构造函数__init__
和一个方法say_hello
,它们都没有使用访问修饰符。因此,它们都是公有的。我们可以在类的外部创建一个Person对象并调用这个方法:
person = Person("Alice", 20)
person.say_hello() # 输出: Hello, my name is Alice and I am 20 years old.
protected属性和方法
在Python中,如果我们需要将属性或方法限制为受保护的,可以在属性和方法名前加上一个下划线。这种受保护的属性或方法可以在类的内部和子类中被访问,但是不能在类的外部被访问。例如,我们可以将上面的Person类中的name
属性改为受保护的:
class Person:
def __init__(self, name, age):
self._name = name
self.age = age
def say_hello(self):
print("Hello, my name is", self._name, "and I am", self.age, "years old.")
现在name
属性是受保护的,我们不能在类的外部直接访问它,但是在类的内部和子类中可以访问:
person = Person("Alice", 20)
print(person._name) # 输出: Alice
private属性和方法
在Python中,如果我们需要将属性或方法限制为私有的,可以在属性和方法名前加上两个下划线。这种私有的属性或方法只能在类的内部被访问,无法在子类和类的外部被访问。例如,我们可以将上面的Person类中的age
属性改为私有的:
class Person:
def __init__(self, name, age):
self._name = name
self.__age = age
def say_hello(self):
print("Hello, my name is", self._name, "and I am", self.__age, "years old.")
现在age
属性是私有的,我们不能在类的外部直接访问它,甚至不能在类的内部使用属性名直接访问,但是可以通过属性的getter和setter方法访问:
person = Person("Alice", 20)
print(person._Person__age) # 报错: 'Person' object has no attribute '__age'
print(person.__age) # 报错: 'Person' object has no attribute '__age'
print(person.say_hello()) # 输出: Hello, my name is Alice and I am 20 years old.
另外,我们可以在类中定义getter和setter方法,以便在类的外部对私有属性进行访问和修改:
class Person:
def __init__(self, name, age):
self._name = name
self.__age = age
def say_hello(self):
print("Hello, my name is", self._name, "and I am", self.__age, "years old.")
def get_age(self):
return self.__age
def set_age(self, age):
if isinstance(age, int) and age > 0 and age < 150:
self.__age = age
else:
print("Invalid age!")
现在我们可以通过getter和setter方法访问和修改私有属性age
:
person = Person("Alice", 20)
print(person.get_age()) # 输出: 20
person.set_age(30)
print(person.get_age()) # 输出: 30
person.set_age(200) # 输出: Invalid age!
以上就是Python封装的基本知识,实际应用中我们应该根据具体情况进行访问修饰符的选择和使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单介绍python封装的基本知识 - Python技术站