首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在初始化时读取变量的名称并将其存储在python的描述符类中?

在Python中,可以使用描述符类来实现在初始化时读取变量名称并将其存储起来的功能。描述符是一种特殊的类,它可以通过定义__get____set____delete__方法来控制对属性的访问。

下面是一个示例代码,演示了如何在初始化时读取变量名称并将其存储在描述符类中:

代码语言:txt
复制
class VariableDescriptor:
    def __get__(self, instance, owner):
        if instance is None:
            return self
        else:
            # 获取调用该描述符的变量名称
            var_name = [name for name, value in owner.__dict__.items() if value is self][0]
            return instance.__dict__[var_name]
    
    def __set__(self, instance, value):
        # 获取调用该描述符的变量名称
        var_name = [name for name, desc in instance.__class__.__dict__.items() if desc is self][0]
        instance.__dict__[var_name] = value

class MyClass:
    var1 = VariableDescriptor()
    var2 = VariableDescriptor()

    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2

# 测试
obj = MyClass(10, 20)
print(obj.var1)  # 输出:10
print(obj.var2)  # 输出:20

在上述代码中,VariableDescriptor是一个描述符类,它的__get__方法用于获取变量的值,__set__方法用于设置变量的值。在__get____set__方法中,通过遍历类的__dict__属性,找到调用该描述符的变量名称,并将其存储在var_name变量中。

MyClass类中,我们定义了两个使用VariableDescriptor描述符的变量var1var2。在初始化时,我们将传入的参数分别赋值给这两个变量。当我们访问obj.var1obj.var2时,实际上是调用了VariableDescriptor__get__方法,该方法会根据调用该描述符的变量名称从__dict__中获取对应的值并返回。

需要注意的是,描述符类是一种高级特性,使用时需要谨慎。在实际开发中,可以根据具体需求考虑是否使用描述符类来实现变量名称的存储。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

流畅的 Python 第二版(GPT 重译)(十二)

一个类似的手动解决方案,与键共享优化很好地配合使用,需要为 Event 类编写一个 __init__,以创建必要的 __speaker_objs 并将其初始化为 None,然后在 speakers 方法中检查这一点...⑤ value 直接存储在 instance.__dict__ 中,再次绕过属性。 ⑥ 构建自定义属性对象并返回它。 值得仔细研究的 示例 22-28 部分围绕着 storage_name 变量展开。...管理实例属性的描述符应将值存储在被管理实例中。这就是为什么 Python 提供instance参数给描述符方法的原因。 存储每个被管理属性的值在描述符实例本身中可能很诱人,但是错误的。...表达式Quantity()被评估为创建一个描述符实例,而Quantity类中的代码无法猜测描述符将绑定到的变量的名称(例如weight或price)。...⁴ 在示例 23-3 中,LineItem描述符类不需要__init__。相反,__set_item__保存了存储属性的名称。

13610

虚拟机类加载机制

接口的加载过程和类的加载过程稍有一些不同:接口也有初始化过程,接口与类有区别的是第三种:当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候才会初始化...在指定类中是否存在符合方法的字段描述符以及简单名称所描述的方法和字段。 符号引用中的类、字段和方法的访问性(private、protected、public、default)是否可被当前类访问。...3.准备     准备阶段是正式为类变量分配内存并设置类变量初始值得阶段,这些内存都将在方法区中进行分配。...2)如果通过了第(1)步,在类C中查找是否有简单名称和描述符都与目标相匹配的方法,如果有则返回这个方法的直接引用,查找结束。    ...只有父接口中定义的变量被使用时父接口才会被初始化,另外,接口的实现类在初始化时页一样不会执行接口的()方法。

47310
  • python基础系列教程——python基础语法全解

    time.tzset() 根据环境变量TZ重新初始化时间相关设置 Time模块包含了以下2个非常重要的属性: 属性 描述 time.timezone 属性time.timezone是当地时区(未启动夏令时...fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。...它定义了该集合中每个对象所共有的属性和方法。对象是类的实例(对象是类实例化之后的结果)。 · 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。...以下使用类的名称Employee 来实例化,并通过 __init__ 方法接受参数。...在python中继承中的一些特点: · 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

    1.1K30

    听GPT 讲Go源代码--netpoll.go

    实际的唤醒操作是在netpoll函数中完成的,该函数使用IO复用技术(如select或epoll)来监听网络事件,并处理已过期的读取截止日期。...该函数一般会在程序初始化时调用一次,以初始化网络轮询事件的相关资源,并将其存储在runtime实例的poll字段中。...在具体实现中,该函数先检查运行时的poll字段是否已经初始化,如果已经初始化,则立即返回;否则,创建一个新的pollDesc变量,并将其赋值给运行时的poll字段。...元素的成员变量都清空,并将其加入到一个链表中。...一旦该fd的I/O事件变得有效(如可读或可写),复用器将该文件描述符从时间轮中删除并通知运行时系统。运行时系统接着调用goroutines和重复这个过程,直到fd的读写操作被完成或发生超时。

    23930

    深入解读Java类加载过程

    典型的运行时数据结构: · Class对象:代表类本身的对象,保存了类的元数据(如字段、方法信息、常量池等) · 方法表和字段表:存储方法和字段的实际运行时信息 · 常量池:已经在方法区加载并解析的常量池数据...存储到方法区:解析后的类信息被存储在方法区中的相应位置,JVM 就可以通过 Class 对象访问类的各种信息,如字段、方法、常量等。...在指定类中是否存在符合方法的字段描述符及简单名称所描述的方法和字段 。符号引用中的类,方法,字段的可访性(privaet/protect/public/)是否可被当前类访问。...字段不存在::符号引用中的字段名称或字段描述符不匹配,例如符号引用指向一个int类型的字段,而类中实际字段类型是String,则会抛NoSuchFieldError。...3.准备 将静态变量(static)分配内存并设置类变量初始值。设0,设null。如果被final修饰,在编译时就会直接赋值。4.解析 将常量池中的符号引用转化为直接引用的过程。

    4600

    JVM类加载机制

    1.加载(loading) (1)查找和导入class文件 类的装载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class...3.准备(Preparation) 给类的静态变量分配存储空间。准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。...(1)这时候进行内存分配的包括类变量(static),而不包括实例变量,实例变量会在对象实例化时随着对象一块分配在Java堆中。...(2)这里所设置的初始值通常情况下是数据类型默认的零值(如0,0L,null,false等),而不是在java代码中被显示赋予的值。...2.字段解析 ​ 对字段进行解析时,会先在本类中查找是否包含有简单名称和字段描述符都与目标相匹配的字段,如果有,则查找结束;如果没有,则会按照继承关系从上往下递归搜索该类所实现的各个接口和他们的父接口

    21010

    流畅的 Python 第二版(GPT 重译)(十三)

    现在让我们从Field类开始研究代码,如示例 24-21 所示。 Field描述符类现在有点不同。在先前的示例中,每个Field描述符实例将其值存储在具有相同名称的属性中。...② 如果__get__的instance参数为None,则描述符是从托管类本身而不是托管实例中读取的。因此我们返回描述符。 ③ 否则,返回存储在名为storage_name的属性中的值。...当 Python 处理用户类的命名空间并读取banana时,它在__prepare__提供的映射中查找该名称:一个WilyDict的实例。...在 Python 和 SQL 中,我更喜欢用空字符串代替None或NULL来表示缺失的数据。学习 Go 强化了这个想法:在 Go 中,原始类型的变量和结构字段默认初始化为“零值”。...¹⁵ 在《流畅的 Python》第一版中,更高级版本的LineItem类使用元类仅仅是为了设置属性的存储名称。请查看第一版代码库中bulkfood 的元类代码。

    16910

    基础IO:系统文件IO

    hello.c 读文件 读取文件的过程与写入类似,使用 read() 系统调用从文件中读取数据。...,拷贝到buf中,最多读取countbytes(sizeof(buf) - 1( - 1是为了在buf的末尾存贮'\0'))。..._cnt:缓冲区中剩余的可用空间字节数。 _base:缓冲区的起始位置。 _flag:存储文件的状态标志,如文件是否处于读写模式等。 _file:该文件对应的系统级文件描述符,这是最直接的文件标识。...Java 的字节码可以在任何实现了 JVM 的操作系统上运行。 Python:Python 通过封装了平台特定的调用接口,提供了跨平台的标准库,如 os、sys 等。...这就是重定向,数组的下标不变,更改文件描述符的指针指向。 使用 dup2() 系统调用 在 Linux 中,dup2() 系统调用用于复制一个文件描述符,并将其指向另一个指定的文件描述符。

    3000

    python之基础篇(四)

    python对象的相关术语: python程序中保存的所有数据都是围绕对象这个概念展开的:   程序中存储的所有数据都是对象。   每个对象都有一个身份、一个类型和一个值。    ...大多数对象都拥有大量特有的数据属性和方法     属性:与对象相关的值。在对象实例化时,在对象内部可以使用的变量的变量名称就称之为对象的属性。    ...所以在python中类和类型是不加区分来使用的,它们指的都是同一个意思。   类由属性和方法组成:     属性(内置的数据):与对象相关的值。...在对象实例化时,在对象内部可以使用的变量的变量名称就称之为对象的属性。在对象(实例)初始化时,由初始化过程来做赋值     方法:被调用时将在对象上执行某些操作的函数。...对实例内部的数据可以执行某些类型的操作,这些操作只能是附加在这些实例上的操作,这些操作是由类在内部定义的。   一个对象在内存中存储,如果有变量名指向它,它就被引用了。

    65220

    有史以来最全的异常类讲解没有之一!爆肝3万字,终于把Python的异常类写完了!最全Python异常类合集和案例演示,第一部分

    捕获到 ZeroDivisionError 异常: division by zero divisor = 0:定义一个名为 divisor 的变量,并将其初始化为 0。这个变量将用作除法运算的除数。...不过,从Python3.3开始,EnvironmentError 被标记为已废弃,并被更具体的异常类如 OSError 和 IOError(在Python 3中,IOError 已经被合并到 OSError...file_content = file.read():如果文件成功打开,这将读取文件的内容并将其存储在 file_content 变量中。但由于文件不存在,这行代码不会被执行。...file_content = file_handle.read():如果文件成功打开,这将读取文件的内容并将其存储在 file_content 变量中。但由于文件不存在,这行代码不会被执行。...file_content = file_handle.read():如果文件成功打开,这将读取文件的内容并将其存储在 file_content 变量中。但由于文件不存在,这行代码不会被执行。

    15810

    面试被问:运行一个HelloWorld程序JVM都经历了什么

    符号引用验证 通过字符串描述的全限定名是否能找到对应的类 在指定类中是否存在符合方法的字段的描述符以及简单名称所描述的方法和字段 符号引用的类,字段,方法的访问性是否可被当前类访问 注:如果无法通过符号引用验证...通过-Xverify:none参数可以关闭大部分类验证措施 程序准备阶段 准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。...(是类变量即static变量,不是实例变量,实例变量将会在对象实例化时随着对象一起分配在java堆中)。...中查找是否有简单名称和描述符都和目标相匹配的方法,如果有则返回这个方法的直接引用,查找结束 否则,在类C的父类中递归查找是否有简单名称和描述符都和目标相匹配的方法,如果有则返回这个方法的直接引用,查找结束...接口C中查找是否有简单名称和描述符都和目标相匹配的方法,如果有则返回这个方法的直接引用,查找结束 否则,在接口C的父接口中递归查找,知道java.lang.Object类,看是否有简单名称和描述符都与目标相匹配的方法

    62610

    JVM 系列(6) —— JVM 类加载机制

    准备 准备阶段是正式为类中的变量(即静态变量、被 Static 修饰的变量)分配内存并设置类变量初始值的阶段。...实例变量将会在对象实例化时随着对象一起分配在 Java 堆中。...如果通过了第一步,在类C中查找是否有简单名称和描述符都与目标相匹配的方法,如果有则返回这个方法的直接引用,查找结束。...否则,在类C的父类中递归查找是否有简单名称和描述符都与目标相匹配的方法,如果有则返回这个方法的直接引用,查找结束。...对于规则3,由于Java的接口允许多重继承,如果C的不同父接口中存有多个简单名称和描述符都与目标相匹配的方法,那将会从这多个方法中返回其中一个并结束查找,《Java虚拟机规范》中并没有进一步规则约束应该返回哪一个接口方法

    40730

    代码世界的构建有一个不可或缺的支柱(如何让代码更加稳健)

    它可以用来描述数据的特征、性质或其他相关信息。例如,在编程中,我们可以为一个对象定义一系列属性,每个属性都有一个相应的属性描述符,用于说明该属性的名称、数据类型、是否可读/可写等。...在不同的编程语言或领域中,属性描述符的具体实现和用法可能会有所不同。有些语言可能提供了特定的语法或机制来定义和使用属性描述符,而在其他情况下,可能需要通过自定义类或数据结构来实现类似的功能。...- 数据序列化和反序列化:在对象序列化和反序列化过程中,属性描述符可以用于指定如何将属性值转换为特定的格式(如 JSON、XML 等),以及在反序列化时将数据还原为对象的属性。...不同的编程语言可能有不同的实现方式和特性来支持属性描述符的使用。 例如,在 Python 中,可以使用 @property 装饰器和 @descriptor 类装饰器来定义属性描述符。...value 属性设置为 0 ,表示属性的初始值。 getter 和 setter 属性分别定义了读取和写入属性时调用的函数。

    8810

    Python 基础题库

    ,password))11.字符串有哪些特点 有序 不可变12.字符串在使用%格式化时,要不要考虑类型,若要,如何考虑要考虑类型 整数%d 字符串%s 浮点数%f13.写出Python...(判断题)Python是一门编译型语言,运行前需要将代码编译成机器码再执行 错误,是解释型语言16.在Python中,想要打开E盘下的t目录下的a.doc文件,在表示该文件的路径时需要注意什么?...,并返回一个列表 readlines()37.什么是继承,有什么特点如果一个类属于一个大类中的一小类,怎这个小类可以继承大类,小类叫子类,大类叫父类特点:子类可以使用父类中的所有方法 子类可以修改父类中的方法...() 找出该代码中的错误并指正login 要大写,改为Login ; 括号后面要加冒号 ():42.类的初始化使用哪个函数(方法—) __init__()43.现有a="tashi",请将字符t...,有什么特点,如何将局部变量声明为全局变量定义在函数内部的变量,只在函数内部生效可以用global将局部变量声明成全局变量60.定义一个函数,可以判断任意字符串有几个数字a=input("请输入任意字符串

    2.6K30

    类加载机制

    可以从数据库中读取,这种场景相对少见些,例如有些中间件服务器(如SAP Netweaver)可以选择把程序安装到数据库中来完成程序代码在集群间的分发。...连接之准备 准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段,从概念上讲,这些变量所使用的内存都应当在方法区中进行分配,但必须注意到方法区本身是一个逻辑上的区域...这时候进行内存分配的仅包括类变量,而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆中。...否则,在类C的父类中递归查找是否有简单名称和描述符都与目标相匹配的方法,如果有则返回这个方法的直接引用,查找结束。...但接口与类不同的是,执行接口的()方法不需要先执行父接口的()方法,因为只有当父接口中定义的变量被使用时,父接口才会被初始化。此外,接口的实现类在初始化时也一样不会执行接口的()方法。

    64220

    详谈类加载的全过程

    来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流; 从其他文件生成,典型应用场景就是JSP; 从数据库中读取,如中间件服务器SAP Netweaver,它可以选择把程序安装到数据库中来完成程序代码在集群间的分发...列举几个验证的内容: 符号引用中通过字符串描述的全限名是否能找到对应的类。 在指定类中是否存在符合方法的字段描述符以及简单名称所描述的方法和字段。...三、准备 准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。...在准备阶段,变量已将赋过一次“零值”,而在初始化阶段,则根据代码逻辑去初始化类变量和其他资源,相当于一个类在实例化时执行类构造器()方法的过程,而在观察类的反编译的时候时长会看到的()方法不需要先执行父类的()方法,接口的实现类在初始化时也不会执行接口的()方法。

    73730

    深入Java类加载全流程,值得你收藏

    加载 类的加载指的是把class文件从磁盘读入内存中,将其放入元数据区域并且创建一个Class对象,放入堆中,Class对象是类加载的最终产品,Class对象并不是new出来的对象。...Class对象获取类的很多信息的原因: 类的方法代码,方法名,字段等 类的返回值 类的访问权限 加载class文件有很多种方式,可以从磁盘上读取,可以从网络上读取,可以从zip等归档文件中读取,可以从数据库中读取...类和方法的全限定名 字段的名称和描述符 方法的名称和描述符, 直接引用是什么呢?一个指向目标的指针地址或者句柄。...Java虚拟机启动时被标明为启动类的类(单测时),Main方法的类。 初始化时类变量会被赋予真正的值,也就是开发人员在代码中定义的值,也会执行静态代码块。...提一下接口的加载 当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,当真正用到父接口的时候才会加载该接口,如下代码,执行main方法,Parent5

    38520

    python基础教程:内置函数(二)

    接下来,该函数从输入中读取一行,将其转换为字符串(除了末尾的换行符)并返回。当读取到 EOF 时,则触发 EOFError。...这总是当前模块的字典(在函数或方法中,不是调用它的模块,而是定义它的模块)。 locals() 更新并返回表示当前本地符号表的字典。在函数块而不是类块中调用 locals() 时会返回自由变量。...它可以同时在类(如 C.f())和实例(如 C().f())上调用。实例除了它的类信息,其他都会被忽略。如果一个类方法在子类上调用,子类会作为第一个实参传入。...它可以在类(例如 C.f() )或实例(例如 C().f() )上调用。实例会被忽略,只需要类本身。 Python中的静态方法与Java或C ++中的静态方法类似。...hash(object) 返回该对象的哈希值(如果它有的话)。哈希值是整数。它们在字典查找元素时用来快速比较字典的键。相同大小的数字变量有相同的哈希值(即使它们类型不同,如 1 和 1.0)。

    1.3K20

    类加载机制你真的了解吗?

    、方法的名称和描述符)。...如果在类中有方法的符号引用(方法的名称和描述符)和目标方法相匹配,则返回这个方法的直接引用,查找结束。否则,在类的父类中递归查找,若找到则返回,查找结束。...由于接口的方法都是public的,所以不存在访问权限的问题。 初始化 这是类加载的最后一步,到这才真正开始执行Java代码。在准备阶段,已经为类变量分配内存,并赋值了默认值。...另外,接口的实现类在初始化时也不执行接口的 方法。 虚拟机会保证在多线程环境下 方法能被正确的加锁、同步。...类的初始化时机:只有对类主动使用的时候才会触发初始化,主动使用的场景如下: 使用new关键词创建对象时,访问某个类的静态变量或给静态变量赋值时,调用类的静态方法时。

    56421

    【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?

    题目部分 如何在Oracle中写操作系统文件,如写日志? 答案部分 可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。...DBMS_ALERT能让数据库触发器在特定的数据库值发生变化时向应用程序发送报警。报警是基于事务的并且是异步的(也就是它们的操作与定时机制无关)。...在CLIENT_INFO列中存放程序的客户端信息;MODULE列存放主程序名,如包的名称;ACTION列存放程序包中的过程名。该包不仅提供了设置这些列值的过程,还提供了返回这些列值的过程。...:从V$SESSION中读取客户端的信息l lDBMS_APPLICATION_INFO.READ_MODULE:从V$SESSION中读取主程序的名称 如何填充V$SESSION的CLIENT_INFO...如何在Oracle中写操作系统文件,如写日志? 可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。

    28.8K30
    领券