python:定义一个等于anoth的方法

2024-05-20 10:45:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在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_confkeystone_wsgi_admin_conf。你知道吗

我认为这会直接起作用,显然这不起作用。你知道吗

我做错什么了?你知道吗


Tags: 方法代码self名称wsgireturn定义admin
2条回答

基本上,有两种方法:

您可以从另一个方法调用一个方法(或从两个方法调用第三个方法):

class Apache:

    def _wsgi_conf(self):
        return {
            ...
        }

    def keystone_wsgi_admin_conf(self):
        return self._wsgi_conf()
    def keystone_wsgi_main_conf(self):
        return self._wsgi_conf()

或者你只是定义相同的方法。这与您打算使用的方法相同,只是在类级别上。你知道吗

class Apache:

    def _wsgi_conf(self):
        return {
            ...
        }

    keystone_wsgi_admin_conf = _wsgi_conf
    keystone_wsgi_main_conf = _wsgi_conf

在类self的实例上设置属性keystone_wsgi_admin_conf非常好。正如您所注意到的,“方法”不会以方法的形式出现。原因如下:

类对象中的方法是正则函数。函数是descriptors,特别是非数据描述符,因为它们没有__set__方法。你知道吗

当您通过点运算符调用^{}时,它不会在您的实例中找到类似wsgi_conf的属性。相反,它将在类中找到一个非数据描述符,将其绑定到赋值self,然后调用它。结果是:

>>> x = Apache()
>>> x.wsgi_conf()

是内部的

>>> type(x).__dict__['wsgi_conf'].__get__(x)()

现在,调用在实例上定义的keystone_wsgi_admin_conf这样的属性

 >>> x.keystone_wsgi_admin_conf()

这是因为您已经做了绑定,绑定已经发生在__init__。你知道吗

self.keystone_wsgi_admin_conf = self.wsgi_conf

相当于

self.keystone_wsgi_admin_conf = type(self).__dict__['wsgi_conf'].__get__(self)

以这种方式分配的绑定方法将重写任何具有相同名称的类非数据描述符。但是,它不会覆盖magic方法,也不会覆盖数据描述符,比如^{}。详情见HowTo in the docs。你知道吗

这样分配的方法不会出现在方法列表中的原因是,方法列表是从类生成的,而不是从实例生成的。你知道吗

虽然您正在使用的方法可以很好地工作,并且在某些情况下可以提供一定程度的灵活性,但在您的情况下,它可能不是最佳的。如果您在每个实例中都有相同的赋值,并且试图避免代码重复,那么您可能只是在浪费引用。避免代码重复的方法是编写函数/方法,然后调用它们,而不是复制和粘贴。你知道吗

TL;DR

您的作业将按预期进行,但您应该执行以下操作:

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

   def keystone_wsgi_admin_conf(self):
        return self.wsgi_conf()

   def keystone_wsgi_main_conf(self):
        return self.wsgi_conf()

相关问题 更多 >