我对编程和Python的新手。我理解在类方法中使用self
并声明类变量,但是,我的问题是:为什么不用self
来声明类方法之外的变量?“我不确定术语,所以我很抱歉如果这个问题已经被回答了另一篇文章。
回答
self
不用于任何地方声明变量。self
为方法的第一个参数的常用名称,作为该方法接收到它结合作为第一个参数到每个呼叫实例。
它不用于“别处”,因为它仅适用于有可绑定的可召集实例的上下文中。
你可能在想的是这样的:
class Foo(object):
y = 1
x = self.y * 2
这是不可能的,因为没有self
- 事实上,在一个类声明的身体评估的时候,有没有实例或类对象然而存在。这也没有必要,因为我们可以直接引用身体范围内的其他变量而不使用self
。
注意,分配给自己的成员,并且分配到类范围的变量做两个不同的东西:
class Foo(object):
y = 1 # class variable
def __init__(self):
self.x = self.y * 2 # instance variable, defined by reference to class variable
first = Foo()
Foo.y = 2
first.y = 3
second = Foo()
print first.x # = 2
print second.x # = 4
我想我混淆了两个概念。在__init__方法中,我使用self.Foo = 3,但是当不在方法中时,我只会使用foo = 3.这就是我迷惑的问题 –
@AaronBooher而这个答案中解释的原因是:您必须使用' self'在方法中引用实例,但在方法外部没有实例可以引用。 – Marcin
自我一个约定 - 不是Python的保留字。常规方法声明中的第一个参数表示该对象。尽管如此,为了代码的可读性和一致性,在外部类中不使用self是常规的看法。
通常,您可以使用任何单词作为变量标识符,但变量名称隐含地是代码文档的一部分,所以最好使用尽可能简单明了的名称挤入5-12符号(这些是我的偏好) - 它们可能会更长,但名称太长会使代码混乱。
self课外是毫无意义的 - 它不会帮助代码读者理解代码。所以你可以使用它,如果你喜欢 - 但这不会是一个好主意。
此链接(http://www.python.org/doc/essays/ppt/acm-ws/sld051.htm)可能会给你一些关于类和实例变量的说明,我相信你在问什么。看看该页面和相应的下一张幻灯片。
如果这并没有解决你问的问题,至于类方法,我不知道如果我知道你指的是什么。我建议阅读关于“classmethod”的(http://docs.python.org/2/library/functions.html#classmethod)和“staticmethod”(http://docs.python.org/2/library/functions.html#staticmethod)
所以换句话说,每个实例的类变量是相同的,并且实例变量根据创建实例的时间而变化 –
- 1. 在java中命名变量的做法。为什么类变量不包变量
- 2. 为什么我的C++类变量意外地改变了范围之外?
- 3. 在类中的方法中访问变量,在该类之外
- 4. 为什么Java不允许在类之外初始化变量或常量?
- 5. 在类之间交换变量的正确方法是什么?
- 6. 类别变量与方法变量
- 7. Ruby为什么要将变量改变到一个类的范围之外?
- 8. 类方法和变量在类方法
- 9. 在类之外使用javascript变量functuon
- 10. 为什么XmlSerializer不能用于共享类变量?
- 11. 为什么变量不变?
- 12. 为什么$ http的回调函数不知道变量之外的变量?
- 13. 为什么java ref vars根据实际对象调用方法,因为变量基于ref变量类型?
- 14. 为什么ruby gem方法返回错误类的变量
- 15. Ruby中类方法的其他用法是什么,除了设置类的属性/变量之外?
- 16. 在actionPerformed()方法之外使用变量
- 17. 为什么PHP不使用在POST之外声明的变量?
- 18. PHP:类之外的静态变量
- 19. C#:为什么调用实现的接口方法对于类变量比接口变量更快?
- 20. 覆盖方法 - 类变量
- 21. 类的方法,不看全局变量
- 22. 为什么UISearchDisplayController必须是类变量?
- 23. Python:为什么类变量被赋值?
- 24. Haskell - 模糊类型变量,为什么?
- 25. 方法之外的变量内容
- 26. 为什么子类不会覆盖其超类变量的值?
- 27. 为什么我不能在类方法中使用预定义的变量?
- 28. 为什么我不能在类块中调用实例变量的方法?
- 29. 在类之外访问全局变量
- 30. 在类之外定义实例变量
你能举一个你的意思吗? “类变量”和“类方法”可能并不意味着你认为他们在Python中做了什么。 – BrenBarn
你有JavaScript的背景吗? (只是一个预感)在这种情况下,你必须考虑不同的对象... –
'self'通常是调用类方法的第一个参数的名称,它引用该类的_instance_而不是类本身。类也是对象,但是它们的类被称为元类 - 您可能不需要关注它。要引用类属性,您可以使用该类的名称,即“My_class.attrib”。 – martineau