我想在python中定义一个等于另一个的方法。我需要分解代码,因为方法的名称是通过其他方法检索的(这里是我要分析的配置文件),对于其中一些方法,要完成的工作是相同的。你知道吗
以下是我迄今为止所做的:
class Apache:
def __init__(self):
self.keystone_wsgi_admin_conf = self.wsgi_conf
self.keystone_wsgi_main_conf = self.wsgi_conf
def wsgi_conf(self):
return {
...
}
# this works but implies loads of code duplication
#def keystone_wsgi_admin_conf(self):
# return {
# ...
# }
这不起作用,该类实例的打印方法列表不显示keystone_wsgi_main_conf
或keystone_wsgi_admin_conf
。你知道吗
我认为这会直接起作用,显然这不起作用。你知道吗
我做错什么了?你知道吗
基本上,有两种方法:
您可以从另一个方法调用一个方法(或从两个方法调用第三个方法):
或者你只是定义相同的方法。这与您打算使用的方法相同,只是在类级别上。你知道吗
在类
self
的实例上设置属性keystone_wsgi_admin_conf
非常好。正如您所注意到的,“方法”不会以方法的形式出现。原因如下:类对象中的方法是正则函数。函数是descriptors,特别是非数据描述符,因为它们没有
__set__
方法。你知道吗当您通过点运算符调用^{} 时,它不会在您的实例中找到类似
wsgi_conf
的属性。相反,它将在类中找到一个非数据描述符,将其绑定到赋值self
,然后调用它。结果是:是内部的
现在,调用在实例上定义的
keystone_wsgi_admin_conf
这样的属性这是因为您已经做了绑定,绑定已经发生在
__init__
。你知道吗相当于
以这种方式分配的绑定方法将重写任何具有相同名称的类非数据描述符。但是,它不会覆盖magic方法,也不会覆盖数据描述符,比如^{} 。详情见HowTo in the docs。你知道吗
这样分配的方法不会出现在方法列表中的原因是,方法列表是从类生成的,而不是从实例生成的。你知道吗
虽然您正在使用的方法可以很好地工作,并且在某些情况下可以提供一定程度的灵活性,但在您的情况下,它可能不是最佳的。如果您在每个实例中都有相同的赋值,并且试图避免代码重复,那么您可能只是在浪费引用。避免代码重复的方法是编写函数/方法,然后调用它们,而不是复制和粘贴。你知道吗
TL;DR
您的作业将按预期进行,但您应该执行以下操作:
相关问题 更多 >
编程相关推荐