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