Python属性管理机制:私有化、__slots__限制与魔术方法详解

听雨眠
听雨眠
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析Python中的属性管理机制,涵盖伪私有属性的命名规则与名称改写原理,详解__slots__对实例属性的限制作用,介绍类型声明的语法及其非强制校验特性,并系统梳理__getattribute__、__setattr__、__delattr__及__getattr__等魔术方法的触发逻辑与执行流程。

一、私有属性

  • Python语言本身并未提供严格意义上的私有化支持,但通过下划线前缀可以实现类似“伪私有”的效果。在Python社区中,广泛遵循一种约定:以单个下划线开头的名称(无论是函数、方法还是数据成员)应被视为非公开API的一部分,暗示外部代码不应直接依赖这些成员。
  • 需要明确的是,Python中的“私有”并非真正的访问控制,它仅是在内部存储属性时修改了属性名的存储方式,使得外部无法通过原始名称直接访问该属性。

私有属性在Python中主要体现为以下两种形式:

  • _参数名:表示声明式私有属性,遵循命名约定。
  • __参数名:表示双下划线的私有属性,Python会对其进行名称改写。
class Attributes:
    attr = 100
    # 声明式私有属性
    _attr2 = 999
    # _类名 + 私有属性名
    __attr3 = 888
print(Attributes.attr)
print(Attributes._attr2)

当尝试直接访问双下划线开头的私有属性时,并不会找到名为__attr3的属性。若通过字典方式查看类的属性字典,可以发现实际的存储名称已被改写。

从输出结果可以看出,双下划线的私有属性在内部被改写为:_类名 + 私有属性名的形式。

二、属性限制-__slots__方法

  1. 通过定义__slots__属性,可以限制类实例所能拥有的属性。实例只能绑定__slots__列表中指定的属性,尝试添加列表之外的属性将被禁止。
  2. 如果尝试添加__slots__未指定的属性,程序会直接抛出错误。
class Demo:
    使用__slots__ 给对象做属性限制,只能添加指定属性name,age
    __slots__ = ['name', 'age']   
m = Demo()
m.name = 111
m.age = 18
print(m.name,m.age)
再去添加指定属性之外的属性
m.sex= 男

执行结果如下: 报错信息:AttributeError: ‘Demo’ object has no attribute ‘sex’,表明Demo对象没有’sex’这个属性。

三、python中如何去声明变量

语法格式为:变量名: 类型。

例如:a: int = [11, 22, 3],这里声明变量a的类型为int,但实际赋值为列表[11, 22, 3]。

Python允许在代码中声明变量或参数的类型,但在代码实际执行过程中,Python解释器并不会对类型进行强制校验。

a: int = "python"    # 设置的为int类型,但是传值为字符串类型
b: str = 11     # 设置的为字符串类型,但是传值为int类型
c: list = {11, 22, 33}     # 设置的为列表,但是传值为字典
print(a, b, c)      # ==========》依然可以执行打印出来

# 函数参数的类型声明:
def work(name: str, age: int):    # 设置的为字符串类型 和 int类型

    print('name的值为', name)
    print('age的值为', age)

# 实际传参一个列表,一个字典
work([11,22,33],{'a':1,'b':2})

执行结果如下:

四、python中的有关属性

__getattr__方法:

用法:用于获取属性。当访问的属性不存在时,会触发此方法。其特殊流程为:在获取属性时,Python首先执行__getattribute__方法检查属性是否存在,若存在则直接返回;若不存在,则进一步执行__getattr__方法,通常返回属性不存在的提示或默认值。

getattribute(self, item):

用法:这是属性访问触发的魔术方法。在查找属性时,Python会第一时间调用该方法,无论属性是否存在(除非引发AttributeError)。

setattr(self, key, value):

用法:用于设置属性。当执行属性赋值操作时,会调用该方法来设置属性值。

__delattr__方法:

用法:在通过del语句删除属性时触发,用于执行删除属性的逻辑。

class MyDemo(object):

    def __getattribute__(self, item):
        """
        属性访问触发的魔术方法
        :param item: 获取的属性名
        :return: 获取到的属性值
        """
        print("您要获取的属性为:", item)
        value = super().__getattribute__(item)    # 继承父类
        return value

    def __setattr__(self, key, value):
        """
        设置属性的方法
        :param key:属性名
        :param value: 属性值
        :return:
        """
        print("您要设置的属性名{},属性值为:{}".format(key, value))
        super().__setattr__(key, value)

    def __delattr__(self, item):
        """
        删除属性的方法
        :param item: 属性名
        :return:
        """
        print("您要删除的属性为:", item)
        super().__delattr__(item)

    def __getattr__(self, item):
        """
        获取属性,属性不存在时触发的方法
        :param item:
        :return:
        """
        print("获取的属性{},不存在".format(item))
        return 99


m = MyDemo()

print("************************* 属性设置 ******************************")
# 属性设置
# 设置属性方式一:
m.aa = 999
m.name = 'musen'

# 设置属性方式二:setattr方法:
setattr(MyDemo(), 'age', 18)

print("************************ 获取属性 *******************************")
# 获取属性
# 方式一:
print(m.aa)
print(m.name)

# 方式二:getattr 方法
print(getattr(m,'name'))

print("************************ 删除属性 ********************************")
# 删除属性
# 方式一:
del m.aa

# 方式二:delattr 方法
delattr(m, 'age')

到此这篇关于python中的属性管理机制的文章就介绍到这了,更多相关python属性管理内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表