在类中声明一个变量(在函数外部):所有类函数都可以访问它(基本上是一个公共变量)
在类中的函数内声明一个变量:只有该函数可以访问它(它在函数范围内)
在类中的函数内声明一个带有self。(变量名)的变量:所有类函数都可以访问它(这与全局(变量名)有什么不同?)
并且因为没有私有/受保护,所以一切都是公共的,所以从类内可以访问的所有内容都可以从类外部访问。
我是否应该知道其他细微差别,或者我几乎得到了它?
答案 0 :(得分:101)
由于你的问题中的列表并非100%明确,我决定用一个简单的例子来解释它。它还包括一些您未在列表中提及的__something
变量。
class Test:
a = None
b = None
def __init__(self, a):
print self.a
self.a = a
self._x = 123
self.__y = 123
b = 'meow'
一开始,a
和b
只是为类本身定义的变量 - 可通过Test.a
和Test.b
访问,而不是特定于任何实例。
创建该类的实例时(导致执行__init__
):
print self.a
找不到实例变量,因此返回类变量self.a = a
:创建了一个新的实例变量a
。这会影响类变量,因此self.a
现在将引用实例变量;要访问类变量,您现在必须使用Test.a
self._x
的分配会创建一个新的实例变量。它被认为“不是公共API的一部分”(又名保护),但从技术上讲它没有不同的行为。self.__y
的赋值创建了一个名为_Test__y
的新实例变量,即它的名称被破坏,因此除非您使用受损的名称,否则无法从该类外部访问它。这可以用于“私人”变量。b
的分配会创建一个局部变量。除了__init__
函数之外,它不能从任何地方获得,因为它没有保存在实例,类或全局范围中。答案 1 :(得分:20)
在类的顶层声明一个变量就像声明一个静态变量或类变量一样。使用self限定它是声明一个实例变量。类变量可以通过类名引用来修改(例如Class.x = 5
),所有实例都将继承这些更改。实例变量是实例专用的,只能由该实例修改。
您可以使用下划线实现某种级别的访问控制。见private variables in the Python tutorial。按照惯例,变量以一个下划线开头,例如_foo
是API的非公开部分,名称以两个下划线开头,例如__foo
将其名称 mangled 设为_classname__foo
。
答案 2 :(得分:-1)
我们可以在其中将范围用作:
情况1:在班上
class test:<br>
def __init__(self, a):
self.__elements = a<br>
def change_a(self): self.__elements = 5
情况2:外部课程
t = test(5)
print(t._test__elements)
答案 3 :(得分:-1)
尽管回答了,但让我在您的问题中添加一些评论:
在类中声明一个变量(在函数外部):所有类函数都可以访问它(基本上是一个公共变量): comment:这就像一个静态变量,可以使用类名来调用。这些变量可用于所有功能,任何功能都可以对其进行修改和打印。
在类内的函数内声明变量:只有该函数才能访问它(在该函数范围内): 注释:如果声明的变量不带self,则只能在该函数中访问,即局部变量。但是,如果使用self.var ='somevalue'这样的self进行声明,则可以通过任何对象但不能通过类名对其进行访问。
在类内的函数内声明一个带有self。(变量名)的变量:所有类函数都可以访问它(这与全局变量(变量名)有何不同?): 评论:请参阅上面的部分。
并且由于没有私有/受保护的,所以一切都是公共的,因此可以从类外部访问所有可以从类内部访问的东西: 评论:是的,但是我们可以使用单个下划线告诉世界这个变量是私有的,但是从技术上讲,实际上并没有将其设为私有。
答案 4 :(得分:-1)
类测试: a =无 b =无
def __init__(self, a):
print self.a
self.a = a
self._x = 123
self.__y = 123
b = 'meow'
这对我有用。感谢ThiefMaster