1. 概述
在 Python 中,私有属性是指不能在类或类的实例外部进行访问的属性。Python 并没有严格意义上的私有属性,而是使用一定的命名规则来达到这个效果。
2. 命名规则
Python 中的私有属性命名规则是以双下划线“__”开头的属性名。这种属性只能在类内部使用,不能在类外部或子类中使用。
除了以双下划线开头的私有属性外,还有以单下划线和以双下划线结尾的属性。以单下划线开头的属性视为“内部使用”的属性,不会像普通属性一样被导入到 from module import * 中。以双下划线结尾的属性是 Python 中的“魔术属性”,用于特殊用途,例如__name__和__doc__等。
3. 示例
下面是一个简单的示例代码,展示了私有属性的定义与使用。
class MyClass:
def __init__(self, x, y):
self.__x = x
self.__y = y
def show(self):
print("x:", self.__x)
print("y:", self.__y)
mc = MyClass(3, 4)
mc.show()
运行结果为:
x: 3
y: 4
在这里,我们定义了一个 MyClass 类,并在其中定义了两个私有属性 __x 和 __y,这些属性只能在类内部使用。我们在该类中还定义了一个 show 方法,用于输出 x 和 y 的值。在实例化 MyClass 类后,我们通过调用这个实例的 show 方法来输出这些值,结果如上。
4. 修改私有属性
4.1 使用公共方法
在 Python 中,如果想要修改私有属性,需要使用类内部的公共方法。在该类中,公共方法可以使用私有属性,并进行修改。
下面是一个示例代码,展示了如何在类的内部使用公共方法来修改私有属性。
class MyClass:
def __init__(self, x, y):
self.__x = x
self.__y = y
def show(self):
print("x:", self.__x)
print("y:", self.__y)
def set_xy(self, x, y):
self.__x = x
self.__y = y
mc = MyClass(3, 4)
mc.show()
mc.set_xy(5, 6)
mc.show()
运行结果为:
x: 3
y: 4
x: 5
y: 6
在这里,我们增加了一个 set_xy 方法,用于修改私有属性 __x 和 __y。在该方法中,我们通过传入新的 x 和 y 值来修改私有属性的值。在实例化 MyClass 类后,我们使用 show 方法来输出原始的 x 和 y 值,然后使用 set_xy 方法来修改这些值,最后再次使用 show 方法来输出结果。
4.2 使用@property装饰器
除了使用公共方法外,还可以使用@property装饰器来修改私有属性。使用@property装饰器时,可以给私有属性添加 get 和 set 方法,分别用于获取和修改属性的值。通过这种方式,可以避免在调用 set 方法时传入错误的值。
下面是一个示例代码,展示了如何使用@property装饰器来修改私有属性。
class MyClass:
def __init__(self, x, y):
self.__x = x
self.__y = y
def show(self):
print("x:", self.__x)
print("y:", self.__y)
@property
def xy(self):
return self.__x, self.__y
@xy.setter
def xy(self, xy):
self.__x, self.__y = xy
mc = MyClass(3, 4)
mc.show()
mc.xy = (5, 6)
mc.show()
运行结果为:
x: 3
y: 4
x: 5
y: 6
在这里,我们使用@property装饰器来定义了一个 xy 方法,用于获取和修改私有属性 __x 和 __y。在 getter 方法中,我们使用元组的形式返回了这两个属性的值;在 setter 方法中,我们使用一个 xy 元组来给这两个属性赋值。在实例化 MyClass 类后,我们使用 show 方法来输出原始的 x 和 y 值,然后使用 xy 方法来修改这些值,最后再次使用 show 方法来输出结果。
5. 总结
Python 中的私有属性定义方式是以双下划线“__”开头的属性名。私有属性可以在类内部使用,但不能在类外部或子类中使用。要在类的内部修改私有属性,必须使用公共方法或@property装饰器。使用公共方法可以直接修改私有属性的值,而使用@property装饰器可以给私有属性添加 get 和 set 方法,分别用于获取和修改属性的值。