| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 933 人关注过本帖
标题:求助,这里cls是None吗?
只看楼主 加入收藏
PYTHON129
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2023-6-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
求助,这里cls是None吗?
本人小白,请帮忙看下这段代码,我想问下,最后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'
搜索更多相关主题的帖子: obj type class def return 
2023-06-10 11:17
东海ECS
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:Python
等 级:版主
威 望:32
帖 子:412
专家分:1646
注 册:2023-1-24
收藏
得分:10 
cls不是None, 它是ClassMethod的对象.
d.__doc__实际上是在访问D的__doc__.由于该    属性被装饰ClassMethod,∴ ClassMethod的__get__被用,返    回了一个对象。

会当凌绝顶,一览众山小.
2023-06-10 13:15
PYTHON129
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2023-6-10
收藏
得分:0 
回复 2楼 东海ECS
您好,感谢您的回复,我还是不太懂,您能进一步解释一下,在执行d.__doc__时,触发了ClassMethod类里面的__get__(self,obj,cls=None),这里的self、obj、cls具体都等于几吗?
2023-06-10 14:24
东海ECS
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:Python
等 级:版主
威 望:32
帖 子:412
专家分:1646
注 册:2023-1-24
收藏
得分:10 
1. self很简单, 就是每一个方法必须带有的参数;
2. obj呢, 是修饰器传递过来的对象, 即d;
3. cls有点难. 由于它被传入时在__doc__方法参数的第一个, 所以它是跟self的作用是一样的, 就是D这个类. 所以说, 在没有像上面这样特殊情况, 类本身的参数定为self, 可以避免误会.

会当凌绝顶,一览众山小.
2023-06-11 07:33
PYTHON129
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2023-6-10
收藏
得分:0 
回复 4楼 东海ECS
好的,非常感谢您的回复!
2023-06-11 11:30
一样很高
Rank: 2
等 级:论坛游民
帖 子:12
专家分:10
注 册:2023-5-7
收藏
得分:0 
cls不是None
2023-06-11 14:55
快速回复:求助,这里cls是None吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016747 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved