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
...