• 第8.28节 Python中使用__setattr__定义实例变量和实例方法


    一、 引言
    根据前面章节介绍的内容,我们知道实例变量、实例方法的定义可以通过以下方法进行:

    1. 在类体中直接定义实例变量、实例方法;
    2. 在实例方法中定义实例变量、实例方法;
    3. 在类体外调用方使用赋值语句赋值定义实例变量、实例方法;
    4. 给实例的__dict__字典中插入元素定义实例可以定义实例变量。
      其实还有一种方法,就是调用object类的__setattr__方法,也可以在实例方法或类体外定义实例变量、实例方法。
      二、 调用语法
    5. 调用语法:对象名.setattr( 实例属性名, 值);
    6. 语法释义:
      1)__setattr__方法是由obejct类实现的,各个没有实现该方法的自定义类自动继承,通过调用该方法可以给实例变量的属性赋值或定义一个新的实例属性(含实例变量和方法),本质上就是给实例所在的名字空间字典中添加或修改了一个“属性:值”对;
      2)“对象名”如果是在实例方法中就是“self”,在类体外就是对于实例的名字;
      3)该方法执行没有返回值,执行结果就是新增或者修改了一个“属性”。

    三、 案例

    1. 案例说明
      1)定义了函数fdrive,准备用于实例方法定义使用;
      2)定义Car类, 其构造方法中定义了power实例变量和 totaldistance实例变量,不过totaldistance是使用__setattr__方法定义的;
      3)类定义后定义了类的实例car,查看实例的__dict__属性,可见实例属性中可以看到实例变量power和totaldistance;
      4)在类体外使用__setattr__方法将函数绑定到car的实例方法driver。

    2. 源代码

    >>> def fdrive(self,distance):self.totaldistance += distance  #定义一个函数,准备用于赋值给类的实例方法属性
    
    >>> class Car():
        def __init__(self, power):
            self.power = power
            self.__setattr__('totaldistance',0)
            
    >>> car = Car('汽油发动机')
    >>> car.__dict__ #查看自定义实例变量
    {'power': '汽油发动机', 'totaldistance': 0}
    >>> car.__setattr__('drive',fdrive)  #定义实例方法drive
    >>> car.__dict__  #查看自定义实例变量
    {'power': '汽油发动机', 'totaldistance': 0, 'drive': <function fdrive at 0x0000000003810730>}
    >>> car.drive(103) #调用实例方法,由于没有绑定self,因此这样调用报错
    Traceback (most recent call last):
      File "<pyshell#61>", line 1, in <module>
        car.drive(103) #调用实例方法,由于没有绑定self,因此这样调用报错
    TypeError: fdrive() missing 1 required positional argument: 'distance'
    >>> car.drive(car,103) #调用实例方法drive
    >>> car.__dict__  #查看自定义实例变量,可以看到totaldistance值修改了
    {'power': '汽油发动机', 'totaldistance': 103, 'drive': <function fdrive at 0x0000000003810730>}
    >>>
    
    
    1. 执行截图
      在这里插入图片描述
    2. 案例总结
      从上述案例可以看出,__setattr__方法可以定义实例变量和实例方法,与引言中介绍的几种方法效果一样。

    本节结合案例介绍了使用__setattr__方法定义实例变量和实例方法的过程,其本质是与《第8.12节 Python类中使用__dict__定义实例变量和方法》一样的。
    老猿Python,跟老猿学Python!
    博客地址:https://blog.csdn.net/LaoYuanPython

    请大家多多支持,点赞、评论和加关注!谢谢!

  • 相关阅读:
    php 接收表单 方法的区别
    php上传图片---初级版
    php 验证格式的函数总结
    行为类模式分析
    深入理解java虚拟机
    JVM生产环境参数实例及分析
    redis 排序(转)
    八种常用的排序算法(转)
    CAS原理分析
    Redis使用总结之与Memcached异同(转)
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/13643714.html
Copyright © 2020-2023  润新知