getattribute和默认参数 *args **kwargs

Posted by tzwlwy's Blog on July 20, 2018

今天再看基础知识的时候看到了一个以前忽略的方法,叫__getattribute__,了解了一下 __getattribute__是属性访问拦截器,就是当这个类的属性被访问时,会自动调用类的__getattribute__方法 每一次调用__getattribute__时,会把参数以str的方式传入,第一版我是这么写的

    def __getattribute__(self,required1, required2, *args,**kwargs):
        print(required1)
        print(required2)
        print(args)
        print(kwargs)
        return object.__getattribute__(self,required1, required2, *args,**kwargs)

然后发现这么写报错了 TypeError: getattribute() missing 1 required positional argument: ‘required2’ 我想看这个方法的内部逻辑是什么,很可惜,点不进去, 后来发现它这边每次传入的值都是str,并且其实它每次只传入一个参数 改进后所有的代码如下

class Tree(object):
    count=0
    def __init__(self,required1, required2, *args,**kwargs):
        self.required1=required1
        self.required2=required2
        self.args=args
        print(type(self.args))
        self.kwargs=kwargs
        print(type(self.kwargs))
        self.count+=1

    def print_more(self):
          print(self.required1)
          print(self.required2)
          print(self.args)
          print(self.kwargs)
          print(self.count)
    def __getattribute__(self,args):
        print(args)
        return object.__getattribute__(self, args)

a=Tree('cap', 'gloves', 'scarf',dessert='macaroon',wine= 'merlot')
a.print_more()
print(a.kwargs)
print(type(a.kwargs))

另外,以前做过笔记args,kwargs结合 (这种需要kwargs 为{}),这个时候如果写的是args, 那么str类型的参数只能是一个,如果是多个的话就必须使用*args,这个时候传入的多个str类型就被整合 成一个tuple了