is it possible not to use “self” in a class?
Possible Duplicate:
Python: How to avoid explicit 'self'?
在python类中,如果需要引用类成员变量,我需要有一个self。在它之前。这是一个问题,我可以不使用,但参考类成员?
谢谢。箱子
- 你可以随心所欲地称呼它,例如只叫EDOCX1(0;)
- 您可以编写一个decorator,它获取一个类属性列表并重写所有访问点,以便首先加载self。这将把全局访问重写为本地访问,这并不难,但由于必须插入新的字节码,而不仅仅是交换ops和arg,这一事实使情况更加复杂。如果有人用有力的方式把它扯下来,我会很感动的。
- 再想一想,并不像我想的那么难。我将它作为一个元类来做,这样您就可以访问类属性了。然后,我将需要使用self进行分配,并重写负载。它不会修改堆栈深度,所以除了重写跳转之外,没有什么棘手的事情。(即使是这样,计算新的数字也会很乏味,但在智力上并不具有挑战性)/
不。
1 2 3 4
| >>> import this
...
Explicit is better than implicit.
... |
要引用类变量,不需要显式的self。您需要它来引用对象(类实例)变量。要引用类变量,只需使用该类名,如下所示:
1 2 3 4 5 6 7 8 9 10
| class C:
x = 1
def set(self, x):
C.x = x
print C.x
a = C()
a.set(2)
print a.x
print C.x |
第一次打印会给您提供1和其他2。尽管这可能不是你想要/需要的。(类变量绑定到类,而不是对象。这意味着它们在该类的所有实例之间共享。btw,在上面的示例中使用self.x将屏蔽类变量。)
- 这样做是不好的(除非你知道你在做什么),因为子类将继续访问C.x,而不是D.x(D是子类)。如果要避免这种行为,请使用type(self).x。现在你知道你在做什么了。
- 我知道这很糟糕,但问题是不要在课堂上使用self。
- 在这种情况下,-1.如果你知道副作用,你就应该警告。
- 我说"这可能不是你想要/需要的"。但我没有想到子类化,这是真的。这是另一个问题。
- 那样的话,我会撤销-1
显式地编写self实际上是有帮助的。这有助于提高可读性——这是Python的优势之一。我个人认为这很有用。
C++中类似的一个论点是,当使用EDCOX1(5)时,只是为了节省EDOCX1×6的命名空间的重复前缀。虽然这可以节省时间,但不应该这样做。
所以习惯于写self。说真的,要花多长时间!
我不知道如何访问对象属性,就好像它们是全局的一样,而不显式地解包或进行其他操作。
如果你不喜欢自己打字,你可以随心所欲地给它命名,比如一个字母的名字。
- 如何重命名?
- @陈彬:你要做的不是def foo(self):,而是def foo(s):。但你不应该这样做,因为预期的是self,你这样做会把人们弄糊涂。无论如何,也没有正当的理由。
出于某种原因,python引用了self-explicit。Python项目的主要目标是可读性和简单性。"一个正确的方法是有一个自我论证和一个明确的参考。
不要质疑仁慈的人…
- 这种"一种正确的方法"的态度(烦人/浪费的方法)使我远离语言,直到被迫进入语言(pandas、sklearn、statsmodels等)。如果该语言有相同的库,我更愿意使用Ruby:这是在用了五年的时间将大量的数据工程和机器学习管道与Python一起投入生产之后——也就是说,这不是一个新手的评论。