百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python中self有哪些赋值方式(python中self的用法)

off999 2024-11-17 14:33 95 浏览 0 评论

这周比较忙,趁周末有空更新一篇文章,本文主要讲解类中实例赋值涉及的几种场景。

方法一;赋值即定义
场景:常用方式
样例:self.name = laokoo

方法二;setattr函数赋值
场景:使用字符串的方式操作实例的属性
样例: setattr(self,'name','laokoo')

方法三;实例字典赋值
场景:非标方式,本质上实例就是通过这种方式储存属性的
样例:self.__dict__[name] = 'laokoo'

方法四;类中实现__setattr__魔术方法
场景:=号赋值的方式,setattr函数的赋值本质上都是调用__setattr__魔术方法进行赋值。
    __setattr__魔术方法中调用基类的该方法可以实现self属性的赋值
    __setattr__魔术方法中使用实例字典赋值的方式可以实现self属性赋值
    __setattr__魔术方法中如果使用=号赋值或者setattr函数会引起无限递归
样例:详见下方代码

方法五;类属性是另外一个类的实例,该类属性也是实例的属性
场景:实例访问类属性会触发描述器调用装饰类__get__方法的返回值
    实例通过=号赋值会触发描述器调用装饰类的__set__方法进行属性设置
样例:详见下方代码

方法六,类中实现__slots__属性
场景:类中实现该方法后会禁用掉实例的字典,实例的属性全部通过类属性进行储存。
    该属性主要针对实例属性过多,内存资源不足,实例属性较为简单的场景
    __slots__不支持动态添加属性,__slots__不支持类继承
建议:可以使用tracemalloc模块测试元组和字典内存空间占用效果
样例:详见下方代码

备注:方法六中我打印了实例属性"member 'name' of 'Person' objects"
    类型是"class 'member_descriptor'"。小弟其实不太明白__slots__
    后端的实现原理,例如__slots__是用什么数据类型存放数据,member_descriptor
    类中不同实例同一个属性是如何存储的。

惯例先上汇总说明,后上代码参考。为了方便大家测试,我将测试区代码封装成了多个小块,大家在测试时根据场景不同区分调用即可。

此外本次测试中描述器方法,反射方法,slots方法可能会相互干扰,所以大家如果有测试需求请测试时关闭掉存在干扰的选项(存在干扰的我已经在文中进行了说明),另外大家如果不太明白描述器原理也可以查看我之前整理的一篇关于描述器的说明。

class Face:

    def __get__(self, instance, owner):
        print('in get ~~~')
        return self

    # 装饰类必须实现set魔术方法才能影响功能类的赋值语句
    def __set__(self, instance, value):
        print('in set ~~~~')
        self.data = value

    def __repr__(self):
        return '<face instance>'


class Person:
    face = Face()

    # #最后测试再开启,slots会禁用掉实例的字典,所以代码中只要使用到实例__dict__的部分都会报错。测试该功能前请关闭dict使用项
    # __slots__ = ['name','age']

    def __init__(self, name):
        print('in init ~~~~')
        self.name = name
        # 观察face的值,观察实例的字典
        self.face = 'myface'

    # 第一阶段我们不设置该魔术方法,第二阶段开启该魔术方法
    def __setattr__(self, key, value):
        print('{} {} in setattr ~~~'.format(key, value))
        print(self.__dict__)
        # 测试一,调用基类方法观察效果
        super().__setattr__(key, value)
        # 测试二,直接使用实例字典赋值观察效果
        # self.__dict__[key] = value
        # 测试三,直接使用实例赋值观察效果
        # self.key = value
        # 测试四,使用setattr函数赋值观察效果
        # setattr(self,key,value)
        print(self.__dict__)


def test_show(user_input: int):
    """为了方便观察,我将一个测试场景进行了打印区分"""
    if user_input == 1:
        """第一阶段使用方式一进行测试
        测试方法:通过=的方式直接赋值
        观察结果:name的值,实例的字典"""
        laokoo = Person('laokoo')
        print(laokoo.name)
        laokoo.name = 'kabu'
        print(laokoo.__dict__)
        print(laokoo.name)
    elif user_input == 2:
        """第一阶段使用方式二进行测试
        测试方法:setattr()函数赋值
        观察结果:name的值,实例的字典"""
        laokoo = Person('laokoo')
        print(laokoo.name)
        setattr(laokoo, 'name', 'kabu')
        print(laokoo.__dict__)
        print(laokoo.name)
    elif user_input == 3:
        """第一阶段使用第三种方式测试
        测试方法:使用实例字典直接赋值(非标)
        观察结果:name的值,实例字典"""
        laokoo = Person('laokoo')
        print(laokoo.name)
        laokoo.__dict__['name'] = 'kabu'
        print(laokoo.__dict__)
        print(laokoo.name)
    elif user_input == 4:
        """第二阶段使用第四种方式测试,这里的知识点比较多
        测试方式:直接赋值,setattr函数赋值,这两种方法在__setattr__中测试
        观察结果:name的值,__setattr__方法执行,实例字典"""
        laokoo = Person('laokoo')
        """观察实例的初始化逻辑,先调用init,然后遇见赋值语句,直接调用__setattr__魔术方法,然后将key,value传入
        因为我们的赋值动作最终实现效果是往实例的字典添加键值对,所以该魔术方法最终也会执行该操作"""
        print(laokoo.name)
    elif user_input == 5:
        """第三阶段使用第五种测试,这里会用到描述器,建议关闭掉功能类的setattr方法,不然显示内容太多
        测试方法:直接赋值,setattr函数赋值
        观察结果:face的值"""
        laokoo = Person('laokoo')
        print(laokoo.face)
        # 观察data是否由值输出
        print(laokoo.face.data)
    elif user_input == 6:
        """第四阶段使用第六种测试,这里会用到__slots__
        """
        laokoo = Person('laokoo')
        setattr(laokoo,'age',18)
        # setattr(laokoo,'x','xx')
        #实例字典会被禁用,会使用类字典储存属性值
        # print(laokoo.__dict__)
        #name字段对应的值是'name': <member 'name' of 'Person' objects>(类型<class 'member_descriptor'>),
        print(Person.__dict__)
        #开启__slot__后name才会切换到类属性
        # print(type(Person.name))

相关推荐

笔记本电脑选哪个品牌比较好

1、苹果APPLE/美国2、戴尔DELL/美国3、华为HUAWEI/中国4、小米MI/中国5、微软Microsoft/美国6、联想LENOVO/中国7、惠普HP/美国8、华硕ASUS/...

10系列显卡排名(10系显卡性能排行)

十系显卡指NVIDIAGeForce10系列,是英伟达研发并推出的图形处理器系列,被用以取代NVIDIAGeForce900系列图形处理器。新系列采用帕斯卡微架构来代替之前的麦克斯韦微架构,并...

最新win7系统下载(windows7最新版本下载)
最新win7系统下载(windows7最新版本下载)

最简单的方法就是,下载完镜像文件后,直接把镜像文件解压,解压到非C盘,然后在解压文件里面找到setup.exe,点击运行即可。安装系统完成后,在C盘找到一个Windows.old(好几个GB,是旧系统打包在这里,垃圾文件了)删除即可。扩展资...

2026-01-15 06:43 off999

哪个电脑管家软件好用(哪个电脑管家好用些)

腾讯电脑管家吧,因为这个是杀毒和管理合一的,占用内存小,因此显得更为简洁,使电脑运行更加流畅此外电脑诊所,工具箱以及4+1的杀毒模式让腾讯电脑管家也收到了广泛的关注4+1杀毒引擎,管家反病毒引擎、金山...

怎么进入win7安全模式(怎么进入win7安全模式界面)

方法如下:1、首先进入Win7系统,然后使用Win键+R组合键打开运行框,输入“Msconfig”回车进入系统配置。2、在打开的系统配置中,找到“引导”选项,然后单击,选择Win7的引导项,然后在“安...

怎么分区固态硬盘(怎样分区固态硬盘)

固态硬盘的分区方法与传统机械硬盘基本相同,以下是一个简单的步骤:1.打开磁盘管理工具:在Windows操作系统中,按下Win+X键,选择"磁盘管理"。或者打开控制面板,在"...

笔记本声卡驱动怎么下载(笔记本如何下载声卡)
笔记本声卡驱动怎么下载(笔记本如何下载声卡)

1、在浏览器中输入并搜索,然后下载并安装。2、安装完成后打开360驱动大师,它就会自动检测你的电脑需要安装或升级的驱动。3、检测完毕后,我们可以看到我们的声卡驱动需要安装或升级,点击安装或升级,就会开始自动安装或升级声卡了。4、升级过程中会...

2026-01-15 05:43 off999

win10加快开机启动速度(加快开机速度 win10)

一、启用快速启动功能1.按win+r键调出“运行”在输入框输入“gpedit.msc”按回车调出“组策略编辑器”?2.在“本地组策略编辑器”依次打开“计算机配置——管理模块——系统——关机”在右侧...

excel的快捷键一览表(excel的快捷键一览表超全)
excel的快捷键一览表(excel的快捷键一览表超全)

Excel快捷键大全的一些操作如下我在工作中经常使用诸如word或Excel之类的办公软件。我相信每个人都不太熟悉这些办公软件的快捷键。使用快捷键将提高办公效率,并使您的工作更加轻松快捷。。例如,在复制时,请使用CtrI+C进行复制,...

2026-01-15 05:03 off999

华硕u盘启动按f几(华硕u盘装系统按f几进入)

F8。1、开机的同时按F8进入BIOS。2、在Boot菜单中,置secure为disabled。3、BootListOption置为UEFI。4、在1stBootPriority中usb—HD...

bootmgr(bootmgrismissing开机不了怎么办)
  • bootmgr(bootmgrismissing开机不了怎么办)
  • bootmgr(bootmgrismissing开机不了怎么办)
  • bootmgr(bootmgrismissing开机不了怎么办)
  • bootmgr(bootmgrismissing开机不了怎么办)
手机云电脑怎么用(手机云端电脑)

使用手机云电脑,您首先需要安装相应的云电脑应用。例如,华为云电脑APP。在安装并打开应用后,您将看到一个显示器的图标,这就是您的云电脑。点击这个图标,您将被连接到一个预装有Windows操作系统和必要...

ie11浏览器怎么安装(ie11浏览器安装步骤)

如果IE浏览器11版本你发现无法正常安装,那么很可能是这样几个原因,一个就是电脑的存储空间不够到时无法安装,再有就是网络的问题,如果没有办法安装的话就不要再安装了,本身这个IE浏览器并不是多好用,你最...

台式机重装系统win7(台式机怎么重装win7)

下面主要介绍两种方法以重装系统:一、U盘重装系统准备:一台正常开机的电脑和一个U盘1、百度下载“U大师”(老毛桃、大白菜也可以),把这个软件下载并安装在电脑上。2、插上U盘,选择一键制作U盘启动(制作...

字母下划线怎么打出来(字母下的下划线怎么去不掉)

第一步,在电脑上找到文字处理软件WPS,双击即自动新建一个新文档。第二步,在文档录入需要处理的字母和数字,双击鼠标或拖动鼠标选择要处理的内容。第三步,在页面的左上方的横向菜单栏,找到字母U的按纽,点击...

取消回复欢迎 发表评论: