Python之属性、特性和修饰符

1.property和@property还是直接上代码来的方便property()用法@property用法2.__getattribute__()、__getattr__()、__set

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

作为面对对象的核心内容,将从以下一个方面进行总结:

  1. property和@property

  2. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

  3. 描述符__get__()、__set__()、__delete__()

  4. 不可变对象的实现

1. property和@property

  还是直接上代码来的方便

  property()用法

#coding = utf-8

class property_test:
    def __init__(self, size=10):
        self.size=size
        
    def __getsize__(self):
        return self.size

    def __setsize__(self, value):
        self.size = value

    def __deletesize__(self):
  
        del self.size

    x= property(__getsize__, __setsize__, __deletesize__)    

if __name__ == "__main__":
    p = property_test()
    p.x = 20
    print (p.size)  >>> 20

   @property用法

#coding = utf-8

'''class property_test:
    def __init__(self, size=10):
        self.size=size
        
    def __getsize__(self):
        return self.size

    def __setsize__(self, value):
        self.size = value

    def __deletesize__(self):
  
        del self.size

    x= property(__getsize__, __setsize__, __deletesize__)   '''

class property_test:
    def __init__(self, size=10):
        self.sizevalue=size     #特别注意sizevalue不要和size同名

    @property
    def size(self):
        return self.sizevalue

    @size.setter
    def size(self, value):
        self.sizevalue = value

    @size.deleter
    def size(self):
        del self.sizevalue

if __name__ == "__main__":
    p = property_test()  
    p.size = 20
    p.size += 20
    print (p.size, p.sizevalue)

2. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

  属性查找过程:

  __getattribute__  >>>> __dict__  >>>> __slots__ >>>> __getattr__

  主要注意__getattr__的用法和无限递归错误

  __getattr__在实例以及对应的__dict__中查找属性失败,那么会调用__getattr__函数

  防止无限递归错误可以使用以下两种方法:

   1. self.__dict__[name] = value
        2. super().__setattr__(name,value)

  例:

class rectange:
    def __init__(self, width=20, height=40):
        self.width = width
        self.height = height

    def __getattr__(self, name):
        return self.width
        
    def __setattr__(self,name, value):
        if name == "squ":
            super().__setattr__(name,value)
            super().__setattr__("width",40)
            super().__setattr__("height",40)
            print (name, self.__dict__[name])
        else:
            #self.__dict__[name] = value
            super().__setattr__(name,value)
            print (name, self.__dict__[name])
    
if __name__ == "__main__":
    p = rectange()
    p.width = 10
    p.squ = 80
    print (p.width, p.height)

3. 描述符

  描述符说的直白点就是一个“绑定行为”的对象属性,通过__get__()、__set__()和__delete__()函数重写描述符属性

  如果上述方法被定义在一个对象中,那么这个对象就是一个描述符

  当定义拥有者类时,每个修饰符对象都是修饰符类的实例,绑定在类级别的属性上

  方法的原型为:

  ① __get__(self, instance, owner)

  ② __set__(self, instance, value)

  ③ __del__(self, instance)

class A:
    def __init(self):
        self.color = "red"
        
    def __get__(self, instance, owner):
        print ("get instance:", instance)
        print ("get owner:", owner)
        return self.color

    def __set__(self, instance, value):
   
        print ("set instance:", instance)
        print ("set value:", value)
        self.color = value

    def __delete__(self, instance):

        print ("delete instance:", instance)
        del self.color

class B:
    a = A()
    def __init__(self):
        self.color = "black"
    
if __name__ == "__main__":
    b = B()
    b.a = "blue"
    b.color = b.a
    del b.a

Python之属性、特性和修饰符

4. 使用__slots__实现不可变对象

  首先说明下__slots__方法,具体可以查看https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200605560b1bd3c660bf494282ede59fee17e781000

  方法:

  1. 把__slots__设为唯一允许操作的属性,这会使得对象内部的__dict__不再有效并阻止对其他属性的访问

  2. 在__init__中调用基类的__setattr__实现

  3. 在__setattr__中抛出异常

  例:

#coding=utf-8

class student:
    __slots__ = ("name")

    def __init__(self, name):
        super().__setattr__("name", name)
        self.name = name
        print (self.name)

    def __str__(self):
        return "{0.name}".format(self)

    def __setattr__(self, name, value):
        raise Exception(" '{__class__.__name__}' has no\
        attribute '{name}'".format(__class__=self.__class__,name=self.name))

if __name__ == "__main__":
    s = student("zhanglin")
    #s.name = "lizhi"

__slot__定义类中可以被外界访问的属性,类似node中的exports。

当父类中定义了__slot__时,不能向父类中添加属性。如果子类中没有定义__slot__,则子类不受父类__slot__定义的限制。

如果父类与子类中都定义了__slot__,则影响的结果为父类与子类__slot__的合集。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120190.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月19日 上午7:00
下一篇 2021年12月19日 上午7:00


相关推荐

  • java批量修改数据库数据_sql批量更新多条数据

    java批量修改数据库数据_sql批量更新多条数据批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:代码如下:UPDATEmytableSETmyfield=’value’WHEREother_field=’other_value’;如果更新同一字段为同一个值,mysql也很简单,修改下where即可:代码如下:UPDATEmytableSETmyfield=’value’WHEREother_…

    2025年6月10日
    5
  • stimulsoft mysql_【Stimulsoft Reports Java教程】在运行时使用MySQL数据库创建报表

    stimulsoft mysql_【Stimulsoft Reports Java教程】在运行时使用MySQL数据库创建报表此示例项目显示如何使用MySQL字段创建新报表并提取MySQL数据库信息。首先,您需要创建一个新报表并添加MySqlDatabase。在StiMySqlDatabase类的构造函数中,您应该设置数据库名称,别名和连接字符串。publicstaticStiReportcreateReport()throwsClassNotFoundException,SQLException,StiE…

    2022年7月13日
    24
  • MATLAB函数句柄

    MATLAB函数句柄之前一直在用,也知道这么个东西,但是没怎么总结。感觉matlab函数句柄就是c语言里面的函数指针,在matlab里面叫它handle,句柄嘛,有了它就可以操纵这个对象(这里也可以叫做函数),这个概念其实可以推广到很多东西,图形fig,自定义函数句柄(也就是下面将会展示的),matlab自带函数句柄,以及某些函数返回的函数句柄,某些类对象或者表达式,也可以叫做句柄。1、何为函数句柄?函数句柄…

    2022年7月17日
    16
  • Linux镜像下载

    Linux镜像下载1.CentOSCentOS官网:https://www.centos.org/CentOS各个版本下载:https://www.centos.org/CentOS版本选择:1.DVD版:这个是常用版本,就是普通安装版了,推荐大家安装。里面包含大量的常用软件,大部分情况下安装时无需再在线下载,体积为4G左右。 2.Everything版:顾名思义,包含了所有…

    2022年4月4日
    62
  • 如何成为一名黑客(新手入门到大师全集)

    如何成为一名黑客(新手入门到大师全集)学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决.基本方向:1.web安全方面(指网站服务器安全方面,进行渗透测试,检测漏洞以及安全…

    2022年5月26日
    40
  • 详解TCP协议三次握手四次挥手

    详解TCP协议三次握手四次挥手详解 TCP 协议三次握手四次挥手

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号