![]() |
1
135
Python>=3.9只需同时使用两个装饰器。看见 this answer Python<3.9属性是在类上创建的,但会影响实例。因此,如果需要classmethod属性,请在元类上创建该属性。
或者,使用Python3的
|
![]() |
2
74
因此,我认为规定的解决方案是创建一个ClassProperty作为property的子类。
但是,二传手实际上不起作用:
你也可以使用
|
![]() |
3
70
我希望这个死简单只读
|
![]() |
4
57
Python 3.9 2020更新 您可以将它们一起使用:
顺序问题-由于描述符如何相互作用,
看见 https://docs.python.org/3.9/library/functions.html#classmethod |
![]() |
5
40
不 然而,classmethod只是一个绑定方法(部分函数),它位于一个可从该类的实例访问的类上。
此代码可用于测试-它应在不引发任何错误的情况下通过:
请注意,我们根本不需要元类——而且您也不能通过元类的实例直接访问元类。
写一篇
|
![]() |
6
34
Python 3![更新:见 @Amit Portnoy's answer 对于版本中更干净的方法>=3.9] 老问题,很多视图,非常需要一个真正的Python 3方式。
幸运的是,这很容易和
|
![]() |
7
18
没有合理的方法使这个“类属性”系统在Python中工作。
问题的症结在于属性是Python所称的“描述符”。没有简单明了的方法来解释这种元编程是如何工作的,所以我必须指出 descriptor howto 只有在实现一个相当高级的框架时,才需要理解这类事情。比如透明对象持久化或RPC系统,或者一种特定于域的语言。 然而,在对之前答案的评论中,你说你
在我看来,你真正想要的是 Observer |
![]() |
8
7
如果您希望通过实例化对象访问class属性,那么仅在meta类上设置它是没有帮助的,在这种情况下,您还需要在对象上安装一个普通属性(它将分派给class属性)。我认为以下几点更为明确:
|
![]() |
9
4
|
![]() |
10
3
您是否至少有权访问该类的一个实例?我可以想出一个办法:
|
![]() |
11
2
尝试一下,它可以在不必更改/添加大量现有代码的情况下完成任务。
这个
|
![]() |
12
2
这里有一个解决方案,它既可以通过类进行访问,也可以通过使用元类的实例进行访问。
这也适用于元类中定义的setter。 |
![]() |
13
1
我找到了一个解决这个问题的干净办法。这是一个叫做
类别实用程序
(
考虑例子:
您可以在类级别和实例级别上使用它:
|
![]() |
14
1
https://stackoverflow.com/a/1800999/2290820
|
![]() |
15
0
对Python2和Python3有效。
|
![]() |
16
-1
这是我的解决方案,它也缓存类属性
|
![]() |
17
-35
这是我的建议。不要使用类方法。
在这种情况下使用类方法的原因是什么?为什么没有一个普通类的普通对象呢?
只有在有需要隐藏的内容时才应该使用属性,这些内容可能在将来的实现中发生更改。 也许你的例子很简单,还有一些地狱般的计算。但它看起来并没有带来显著的价值。 受Java影响的“隐私”技术(在Python中,属性名称以_开头)实际上没有多大帮助。谁的私人信件?当您拥有源代码时,private的意义有点模糊(就像在Python中一样) 受Java影响的EJB风格的getter和setter(通常在Python中作为属性完成)用于促进Java的基本自省,以及通过静态语言编译器。所有这些getter和setter在Python中都没有那么有用。 |
|
simply lemon · python上链表的添加方法 1 年前 |
|
Anonymous · 为什么在这个例子中self和类名的用法不同? 1 年前 |
![]() |
P N Singh · 在CPP Oops中调用对象而不创建它 1 年前 |
![]() |
Muthuraj · 如何创建一个通用工厂来创建某种类型的实例[重复] 1 年前 |
![]() |
Andy Votava · 从父类定义调用学生方法 1 年前 |