首页 > 其他分享 >实例化对象内自产自销

实例化对象内自产自销

时间:2023-01-12 20:34:53浏览次数:41  
标签:__ users Chain 自产自销 对象 self michael 实例 path

class Chain(object):

    def __init__(self, path=''):
        self._path = path
        
    def __call__(self,user_name=''):
        return Chain('%s/%s' % (self._path, user_name))

    def __getattr__(self, path):
        return Chain('%s/%s' % (self._path, path))

    def __str__(self):
        return self._path

    __repr__ = __str__  #两个函数返回的数据一样,形式不同,__repr__返回的是给用户看的,__str__返回的是调试信息,给开发者的
    
#/users/michael/repos
a = Chain()
b = a.users
c = b('michael')
d = c.repos
d

Chain().users('michael').repos

步步拆解,理解上面的代码块

  1. 第一步

    In [1]:
    Chain()  # 初始化实例并打印
    Out[1]:
    

    创建实例Chain(),由于没有传入 path参数,默认参数 path="",所以直接打印实例结果也为 空。

  2. 第二步
    In [2]:

    Chain().users
    

    Out[2]:/users

    尝试调用实例Chain()的users属性,由于users属性没有定义,于是调用__getattr__()方法。

    根据Chain类的定义,进入__getattr__()内部后执行Chain().
    传入参数"self.__path/path"(这里的 self.__path为第一步默认值"".
    path为第二步尝试调用的"users",即拼接成"/users",也就是执行:Chain("/users")

    这相当于在类的内部实例化自己然后传入参数"/users"。

    也就是说,在执行Chain().users时,由于实例没有定义users这个属性,于是调用__getattr__()方法,最终执行的是Chain("/users"),结果就打印出/users。

  3. 第三步
    In [3]:

    Chain().users("michael")
    

    Out[3]:/users/michael

    由于定义了__call__()方法,使得可以将对象实例当作方法一样调用

    第二步中,执行Chain().users相当于实例化了一个对象:Chain("/users")

    于是第三步就相当于,把这个对象实例当做方法直接调用Chain("/users")(),并传入参数"michael"此时执行的就是 call()方法

    同理,根据Chain类的定义,进入__call__()内部后,执行Chain(),传入参数"self.__path/path"

    这里的self.__path为第二步的结果"/users"path为第三步传入的"michael",即拼接成"/users/michael",也就是执行:Chain("/users/michael")

  4. 第四步
    In [4]:

    Chain().users("michael").repos
    

    Out[4]:/users/michael/repos

    第三步的最后相当于执行对象实例Chain("/users/michael"),那么第四步,就在这个实例基础上尝试调用repos属性,显然repos属性没有被定义,于是再次调用__getattr__()方法。然后就重复第二步的逻辑,最终完成拼接/users/michael/repos

标签:__,users,Chain,自产自销,对象,self,michael,实例,path
From: https://www.cnblogs.com/HugoWang010220/p/17047843.html

相关文章

  • Python----类和面向对象
    #驼峰命名法classCall_Phone():#类当中的函数叫类方法,类下面添加函数时会自动添加self.self代表类的实例#类的方法必须有一个额外的参数,惯例为self,后面......
  • C# 中,对象转JSON以及对象转JSON字符串或者反向转换
    对象转JSON:1privatevoidbutton3_Click(objectsender,EventArgse)2{3SaleOrder_Save_Main.MainSM=newSaleOrder_Save_Main......
  • wkhtmltopdf 目录对象使用 及 目录样式分享
    最近又是更新了报告模板的样式新使用了目录对象因为直接生成的目录样式比较丑所以这边使用的是自定义xsl                    ......
  • python的迭代对象和迭代器
    Python中迭代对象(Iterable)是非常核心的内容,今天就和大家分享一下,什么是迭代对象和迭代器.简单来说迭代就等于循环,那么迭代对象就是可以用for循环的对象.一句话记......
  • Oracle修改实例名
    只需要修改环境变量ORACLE_ID,口令文件及参数文件的名称即可关闭数据库、停止实例SQL>shutdownimmediateDatabaseclosed.Databasedismounted.ORACLEinstanc......
  • java8 对象转 Map 时重复 key Duplicate key xxxx
    java8对象转Map时重复keyDuplicatekeyxxxxhttps://dongguabai.blog.csdn.net/article/details/98397784?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_rel......
  • EF 操作实例
    一、Linq语法List操作1.1         有参       publicList<GoodsInfo>ShowInfo(stringGName,int?Gid)       {           ......
  • jQuery对象的筛选(过滤)
    视频<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>15_筛选_过滤</title></head><body><ul><li>AAAAA</li><lititle="hello"class="box......
  • jQuery对象的筛选(查找)
    视频<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>16_筛选_查找孩子-父母-兄弟标签</title></head><body><divid="div1"class="box"title="o......
  • 面向对象-java
    //造车:1.画图纸.1.定义车的属性信息:color,speed,seat2.定义车的动作:跑.2.拿着图纸找工厂生产车面向对象的世界里类:就是图纸属性:这一类事物拥有的共同属性动作:这......