python 怎么把类方法装饰为属性?

2016-10-12 19:04:38 +08:00
 vtoexsir
class C(object):
@classmethod
def m():
pass


m()是类方法,调用:
C.m()
但我当成属性的方式调用,像这样:
C.m
请问该怎么弄呢?
请最好提供个简单的例子, 多谢!
2459 次点击
所在节点    Python
11 条回复
cheetah
2016-10-12 19:10:44 +08:00
没什么简单的办法,也许用 metaclass 可以做到
glogo
2016-10-12 19:11:12 +08:00
使用 data descriptor?或者是实现 __call__()方法这种?
Yinz
2016-10-12 19:11:51 +08:00
@property
Google 的话解释和例子会比较详细
Yinz
2016-10-12 19:14:22 +08:00
咦,没看到是类方法🤔
binux
2016-10-12 19:15:43 +08:00
```
class C(object):
@classmethod
def _m(cls):
return 1

m = property(lambda s: s._m())
```
thinker3
2016-10-12 19:29:29 +08:00
类方法不是还有一个 cls 参数么?
eric6356
2016-10-12 19:30:15 +08:00
stackoverflow 上有个方法是继承 property 并且改写__get__方法
http://stackoverflow.com/questions/128573/using-property-on-classmethods
aaronzjw
2016-10-12 19:46:45 +08:00
SlipStupig
2016-10-13 00:28:02 +08:00
\@property
linuxchild
2016-10-13 00:38:21 +08:00
bwangel
2016-10-13 09:39:53 +08:00
参考这篇答案: http://stackoverflow.com/questions/128573/using-property-on-classmethods

写了一个小例子, classProperty 只有 getter 可以使用:

<script src="https://gist.github.com/bwangel23/6323253b0f1fcb48a578c21c86af95ca.js"></script>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/312304

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX