Python 为什么我需要使用;“自我”;在类方法中引用类变量?

Python 为什么我需要使用;“自我”;在类方法中引用类变量?,python,Python,我将channel\u mapping定义为类变量,为什么需要使用self来引用它?我想我应该在process()函数中使用channel\u mapping或cls.channel\u mapping 另外,要将channel_mapping定义为这样的类变量,或者在初始值设定项中将其定义为实例变量,在这两种情况下是否存在线程安全问题 我将“channel_mapping”定义为类变量,为什么需要这样做 用“自我”来指代它 您可以通过类及其方法内部的self(如果您确保它是只读的)和cls,并

我将
channel\u mapping
定义为类变量,为什么需要使用
self
来引用它?我想我应该在
process()
函数中使用
channel\u mapping
cls.channel\u mapping

另外,要将
channel_mapping
定义为这样的类变量,或者在初始值设定项中将其定义为实例变量,在这两种情况下是否存在线程安全问题

我将“channel_mapping”定义为类变量,为什么需要这样做 用“自我”来指代它

您可以通过类及其方法内部的
self
(如果您确保它是只读的)和
cls
,并通过类外部的类对象或实例引用类变量

使用
cls
self
有什么区别<因为类方法不需要初始化,所以在类方法中使用code>cls,因此对象的实例也不需要初始化,
self
在需要对象实例的方法中使用

我想我应该用 “通道映射”

python中的作用域与C中的作用域不同,例如,在C中,您可以通过只编写类变量的名称来调用该类变量,而忽略冗余的
this
。在Python中,必须使用
self
引用实例的变量。类变量也是如此,但改为使用
cls
(或
self

如果您引用的是
channel\u mapping
,那么您只是引用了当前或全局作用域中的变量,不管它是否存在,而不是类或它的实例中的变量

或“进程”函数中的cls.channel_映射

从类方法中,您一定要使用
cls.channel\u mapping
,因为
cls
表示类对象。但是从实例的方法中,您可以使用
self.\uuuu class\uuu.channel\u映射来引用类变量,而不是
cls
。它只需返回实例的类,该类等于
cls
,然后调用类变量
channel\u mapping

self.channel\u mapping
虽然会返回相同的结果,但这只是因为在代码中没有名为
channel\u mapping的实例属性,因此python可以解析对类变量的引用。但是,如果实例中存在
channel\u映射
变量,那么它将不再与原始类变量相关,因此在这种情况下,您将希望保持
channel\u映射
只读

总之,要从类方法中引用类变量,您只需使用
cls
,而从实例方法中引用类变量,您最好使用
self.\uuu class\uuuuuuuu.var
构造,而不是
self.var
one

另外,要像这样将“channel_mapping”定义为类变量,或者在初始值设定项中将其定义为实例变量,在这两种情况下都存在线程安全问题吗

有些情况下,您需要同时更改所有实例中的变量,也就是说,当类变量派上用场时,您不需要更新每个实例中的每个负责实例变量,您只需更新类变量即可

但是说到线程安全,我不确定它是否会在每个线程中同时更新,但是
self.\uuu class\uuu
会在更新后立即返回类a的更新版本,因此,
self.\uuuuu class\uuuuu
变量在每次调用它时都是最新的,在这段时间内,不同的线程将使用同一变量的不同值

用初始化变量进行更新,如果有不止一个实例,则需要更长的更新时间,因此,<<强>将>认为它不太安全。

我将“channel_mapping”定义为类变量,为什么需要这样做 用“自我”来指代它

您可以通过类及其方法内部的
self
(如果您确保它是只读的)和
cls
,并通过类外部的类对象或实例引用类变量

使用
cls
self
有什么区别<因为类方法不需要初始化,所以在类方法中使用code>cls
,因此对象的实例也不需要初始化,
self
在需要对象实例的方法中使用

我想我应该用 “通道映射”

python中的作用域与C中的作用域不同,例如,在C中,您可以通过只编写类变量的名称来调用该类变量,而忽略冗余的
this
。在Python中,必须使用
self
引用实例的变量。类变量也是如此,但改为使用
cls
(或
self

如果您引用的是
channel\u mapping
,那么您只是引用了当前或全局作用域中的变量,不管它是否存在,而不是类或它的实例中的变量

或“进程”函数中的cls.channel_映射

从类方法中,您一定要使用
cls.channel\u mapping
,因为
cls
表示类对象。但是从实例的方法中,您可以使用
self.\uuuu class\uuu.channel\u映射来引用类变量,而不是
cls
。它只需返回实例的类,该类等于
cls
,然后调用类变量
channel\u mapping

self.channel\u mapping
虽然会返回相同的结果,但这只是因为在代码中没有名为
channel\u mapping的实例属性,因此python可以解析对cl的引用
class Channel(object)
  channel_mapping = {
    'a': 001,
    'b': 002,
    'c': 003
  }

  def __init__(self):
    ...

  def process(self, input):
    channels = input.split(',')
    for channel in channels:
       if channel in self.channel_mapping:
          channel = self.channel_mapping[channel]
          break
     ...