python中的属性管理机制详解

目录
  • 一、私有属性
  • 二、属性限制-__slots__方法
  • 三、python中如何去声明变量
  • 四、python中的有关属性

一、私有属性

  • Python并没有真正的私有化支持,但可用下划线得到伪私有,有一项大多数 Python 代码都遵循的习惯:带有下划线,前缀的名称应被视为非公开的 API 的一部分(无论是函数、 方法还是数据 成员)
  • python中私有并没有实现真正的私有,只是在保存属性的时候改了个名字,在外部无法直接方法

私有属性具体表现为:

  • _参数名 : 声明式私有属性
  • __参数名 : _类名 + 私有属性名
class Attributes:
    attr = 100
    # 声明式私有属性
    _attr2 = 999
    # _类名 + 私有属性名
    __attr3 = 888
print(Attributes.attr)
print(Attributes._attr2)

双下划线的私有属性,在去调用的时候 ,并没有__attr3 这个属性名,用 dict 属性,去查看属性字典看下:


可以看到是双下划线的私有属性是:_类名 + 私有属性名

二、属性限制-__slots__方法

  1. 定义过slots属性来限制类实例的属性,只能绑定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中可以声明变量或者参数的类型,但是实际上代码执行是不会去校验类型

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__方法:

用法:获取属性,属性不存在时触发的方法
特殊流程:当去获取属性时,先执行__getattribute__去看有没有属性,有就返回,如果没有就去执行__getattr__方法,返回属性不存在

getattribute(self, item):

用法:属性访问触发的魔术方法,查找属性时,第一时间会调用该方法

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属性管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Django 后台管理之后台模型属性详解

    十八.Django 后台模型属性篇 继续在之前的项目中进行代码的编码,首先要回忆一下通过 createsuperuser 命令创建的管理员账号,如果忘记了,需要重新创建一个. 本篇博客涉及的代码都在 admin.py 文件中,如果你首次打开本篇文章,请翻看本文结尾出的目录大纲,可以再次学习. 为了便于学习,提前在 models.py 中新增一个类,代码如下: from django.db import models class MyCenter(models.Model): pass 18.1

  • python中的属性管理机制详解

    目录 一.私有属性 二.属性限制-__slots__方法 三.python中如何去声明变量 四.python中的有关属性 一.私有属性 Python并没有真正的私有化支持,但可用下划线得到伪私有,有一项大多数 Python 代码都遵循的习惯:带有下划线,前缀的名称应被视为非公开的 API 的一部分(无论是函数. 方法还是数据 成员) python中私有并没有实现真正的私有,只是在保存属性的时候改了个名字,在外部无法直接方法 私有属性具体表现为: _参数名 : 声明式私有属性 __参数名 : _类

  • Python中property属性的用处详解

    目录 前言 限制值 使用 @property 的方式代替. 动态属性的好处 动态显示 附:用property代替getter和setter方法 总结 前言 Python 动态属性的概念可能会被面试问到,在项目当中也非常实用,但是在一般的编程教程中不会提到,可以进修一下. 先看一个简单的例子.创建一个 Student 类,我希望通过实例来获取每个学生的一些情况,包括名字,成绩等.成绩只有等到考试结束以后才会有,所以实例化的时候不会给它赋值. class Student: def __init__(

  • python中的decimal类型转换实例详解

    [Python标准库]decimal--定点数和浮点数的数学运算 作用:使用定点数和浮点数的小数运算.         Python 版本:2.4 及以后版本 decimal 模块实现了定点和浮点算术运算符,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模型,即大多数计算机硬件实现的 IEEE 浮点数运算.Decimal 实例可以准确地表示任何数,对其上取整或下取整,还可以对有效数字个数加以限制. Decimal 小数值表示为 Decimal 类的实例.构造函数取一个整数或字符串作为参数.使用

  • Python中Selenium库使用教程详解

    selenium介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转.输入.点击.下拉等,来拿到网页渲染之后的结果,可支持多种浏览器 中文参考文档 官网 环境安装 下载安装selenium pip install selenium -i https://mirrors.aliyun.com/pypi/simple/ 谷歌浏览器驱动程序下载地址:

  • chatGPT之Python API启用上下文管理案例详解

    chatGPT已经爆火一段时间了,我想大多数的开发者都在默默的在开发和测试当中,可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧. 为什么别人的机器人能联想之前的语料,而你的却像个每次都只如初见的高冷机器人? 我也是参考官方文档去阅读和理解的,但是有时候官方文档以为你很懂了,就没有太多说明,废话不多说下面我跟大家讲一下API调用时如何启用上下文管理的. 官方案例: # Note: you need to be using OpenAI Python v0.27.0 for

  • Python 中迭代器与生成器实例详解

    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的所有元素,但是不想用for循环 解决方案:使用next()函数,并捕获StopIteration异常 def manual_iter(): with open('/etc/passwd') as f: try: while True: line=next(f) if line is None: br

  • python中实现k-means聚类算法详解

    算法优缺点: 优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去. 1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好.另一种则是根据具体的需求确定,比如说进行衬衫尺寸的聚

  • python实现差分隐私Laplace机制详解

    Laplace分布定义: 下面先给出Laplace分布实现代码: import matplotlib.pyplot as plt import numpy as np def laplace_function(x,beta): result = (1/(2*beta)) * np.e**(-1*(np.abs(x)/beta)) return result #在-5到5之间等间隔的取10000个数 x = np.linspace(-5,5,10000) y1 = [laplace_functio

  • python中的subprocess.Popen()使用详解

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数,比如:os.system os.spawn* os.popen* popen2.* commands.* 一.subprocess.Popen subprocess模块定义了一个类: Popen class subprocess.Popen( args, bufsize=0, executable

  • Python对象的属性访问过程详解

    只想回答一个问题: 当编译器要读取obj.field时, 发生了什么? 看似简单的属性访问, 其过程还蛮曲折的. 总共有以下几个step: 1. 如果obj 本身(一个instance )有这个属性, 返回. 如果没有, 执行 step 2 2. 如果obj 的class 有这个属性, 返回. 如果没有, 执行step 3. 3. 如果在obj class 的父类有这个属性, 返回. 如果没有, 继续执行3, 直到访问完所有的父类. 如果还是没有, 执行step 4. 4. 执行obj.__ge

随机推荐