注册 登录
编程论坛 Python论坛

求助,这里cls是None吗?

PYTHON129 发布于 2023-06-10 11:17, 985 次点击
本人小白,请帮忙看下这段代码,我想问下,最后d.__doc__执行的结果为什么没有打印"旺财"呢?self是__doc__,obj是d,cls应该没有传入吧,所以应该满足"cls is None"这个条件吧?是我理解有问题吗?请大神指教!

class MethodType:
    def __init__(self,func,obj):
        self.__func__=func
        self.__self__=obj
    def __call__(self,*args,**kwargs):
        func=self.__func__
        obj=self.__self__
        print("小白")
        return func(obj,*args,**kwargs)

   
class ClassMethod:
    def __init__(self,f):
        self.f=f
    def __get__(self,obj,cls=None):
        if cls is None:
            print("旺财")
            cls=type(obj)
        if hasattr(type(self.f),'__get__'):
            print(f"来福,type(self.f)->{type(self.f)}")
            return self.f.__get__(cls,cls)
        return MethodType(self.f,cls)

   
class D:
    @ClassMethod
    @property
    def __doc__(cls):
        return f"I love FishC.--from class {cls.__name__}"

d=D()
d.__doc__
来福,type(self.f)-><class 'property'>
'I love FishC.--from class D'
5 回复
#2
东海ECS2023-06-10 13:15
cls不是None, 它是ClassMethod的对象.
d.__doc__实际上是在访问D的__doc__.由于该    属性被装饰ClassMethod,∴ ClassMethod的__get__被用,返    回了一个对象。
#3
PYTHON1292023-06-10 14:24
回复 2楼 东海ECS
您好,感谢您的回复,我还是不太懂,您能进一步解释一下,在执行d.__doc__时,触发了ClassMethod类里面的__get__(self,obj,cls=None),这里的self、obj、cls具体都等于几吗?
#4
东海ECS2023-06-11 07:33
1. self很简单, 就是每一个方法必须带有的参数;
2. obj呢, 是修饰器传递过来的对象, 即d;
3. cls有点难. 由于它被传入时在__doc__方法参数的第一个, 所以它是跟self的作用是一样的, 就是D这个类. 所以说, 在没有像上面这样特殊情况, 类本身的参数定为self, 可以避免误会.
#5
PYTHON1292023-06-11 11:30
回复 4楼 东海ECS
好的,非常感谢您的回复!
#6
一样很高2023-06-11 14:55
cls不是None
1