内部方法引用python类的快捷方式/别名

内部方法引用python类的快捷方式/别名,python,Python,考虑一个带有类级别变量的classstateMgristerrcvCntr: class StateMgrListener(BaseListener): rcvCntr = 0 def handler(self,msg): StateMgrListener.rcvCntr += 1 与其重复使用整个类名,我更愿意以类似于以下方式引用该类变量: s.rcvCntr += 1 但以下措施不起作用: 有什么方法可以做到这一点吗?通常,您不会按名称引用该类。您可以通过实例访

考虑一个带有类级别变量的
class
stateMgrister
rcvCntr

class StateMgrListener(BaseListener):
  rcvCntr = 0

  def handler(self,msg):
    StateMgrListener.rcvCntr += 1
与其重复使用整个类名,我更愿意以类似于以下方式引用该类变量:

    s.rcvCntr += 1
但以下措施不起作用:

有什么方法可以做到这一点吗?

通常,您不会按名称引用该类。您可以通过实例访问属性:

def handler(self, msg):
    type(self).rcvCntr += 1
如果
StateMgrListener
的子类定义了自己名为
rcvCntr
的类属性,则该属性将递增,而不是
StateMgrListener.rcvCntr
。然而,这通常是你想要的

另一种选择是不允许从实例方法直接访问类变量,而是通过类方法

@classmethod
def incr_counter(cls):
    cls.rcvCntr += 1

def handler(self, msg):
    self.incr_counter()
这假设
hander
使用
self
来访问
incr\u计数器
;如果没有,那么
处理程序本身就是类方法的候选对象。

通常,您不按名称引用类。您可以通过实例访问属性:

def handler(self, msg):
    type(self).rcvCntr += 1
如果
StateMgrListener
的子类定义了自己名为
rcvCntr
的类属性,则该属性将递增,而不是
StateMgrListener.rcvCntr
。然而,这通常是你想要的

另一种选择是不允许从实例方法直接访问类变量,而是通过类方法

@classmethod
def incr_counter(cls):
    cls.rcvCntr += 1

def handler(self, msg):
    self.incr_counter()

这假设
hander
使用
self
来访问
incr\u计数器
;如果没有,则
handler
本身就是类方法的候选对象。

在执行类定义之前,不会定义类的名称

创建类后,可以分配
StateMgrListener.s

class StateMgrListener(BaseListener):
    def handler(self, msg):
        s.revCntr += 1

StateMgrListener.s = StateMgrListener
另一个选项是在
方法中设置它

class StateMgrListener(BaseListener):
    def __init__(self):
        StateMgrListener.s = StateMgrListener
        ...

    def handler(self, msg):
        s.revCntr += 1

在执行类定义之前,不会定义类的名称

创建类后,可以分配
StateMgrListener.s

class StateMgrListener(BaseListener):
    def handler(self, msg):
        s.revCntr += 1

StateMgrListener.s = StateMgrListener
另一个选项是在
方法中设置它

class StateMgrListener(BaseListener):
    def __init__(self):
        StateMgrListener.s = StateMgrListener
        ...

    def handler(self, msg):
        s.revCntr += 1

我确实想到了这一点——风险在于,在类初始化过程中,如果在内部调用任何引用
s
True的方法。另一个选项是在
\uuuuu init\uuuu
方法中设置它!所以在
\uuuuu init\uuuuuuu
中,它将是可用的-那么这可能就是我正在寻找的!。。除了我正在子类化
tornado.RequestWebHandler
——这不允许使用
\uuu init()\uuuu
方法。现在,烦恼完全是一个单独的讨论..根据您的经验,我将乐观地认为您使用
\uuu init()\uu
的解决方案能够工作并获得奖励。我确实想到了这一点-如果在类初始化过程中调用了任何方法,并且引用了
s
True,则会有风险。另一个选项是在
\uuuuu init\uuuu
方法中设置它!所以在
\uuuuu init\uuuuuuu
中,它将是可用的-那么这可能就是我正在寻找的!。。除了我正在子类化
tornado.RequestWebHandler
——这不允许使用
\uuu init()\uuuu
方法。现在,烦恼是一个单独的讨论。根据您的经验,我将乐观地认为您使用
\uuuu init()\uuuu
的解决方案有效并获得奖励。同意希望访问子类属性。这仍然是相当冗长,但我想这就是我们所拥有的。ThxIt不像你需要经常输入这个。优化阅读,而不是写作。另外,你有没有考虑过简单地使用较短的类名?我们都有自己的“东西”。我不能忍受
self.someMethod
self.someAttribute
而使用
s.someMethod
。我的团队正在全力以赴抛弃政治公众人物。我可能会使用该建议将其放入
\uuu init\uu
中,并将使用
c
指示类本身。我发现它实际上更可读。同意希望访问子类属性。这仍然是相当冗长,但我想这就是我们所拥有的。ThxIt不像你需要经常输入这个。优化阅读,而不是写作。另外,你有没有考虑过简单地使用较短的类名?我们都有自己的“东西”。我不能忍受
self.someMethod
self.someAttribute
而使用
s.someMethod
。我的团队正在全力以赴抛弃政治公众人物。我可能会使用该建议将其放入
\uuu init\uu
中,并将使用
c
指示类本身。我发现它实际上更具可读性。通常方法的第一个参数总是称为
self
。使用与快捷方式相同的变量会使事情变得混乱。@Barmar纠正了这一问题,即在本问题中,方法的第一个参数通常称为
self
。您使用了与快捷方式相同的变量,这使事情变得混乱。@Barmar在回答这个问题时纠正了这一点