【问题标题】:Access class in optional parameter initialization可选参数初始化中的访问类
【发布时间】:2016-05-02 04:23:30
【问题描述】:

假设我有一个带有可选参数的初始化器

def __init__(self, seed = ...):

现在,如果未指定参数,我想提供一个默认值。但是种子很难计算,所以我有一个类方法可以根据一些类变量建议种子

MyClass.seedFrom(...)

现在我怎么能从那个地方调用它?如果我使用self:

def __init__(self, seed = self.__class__.seedFrom(255)):

那时我绝对不知道什么是自我。如果我直接使用类名(我讨厌这样做):

def __init__(self, seed = MyClass.seedFrom(255)):

它抱怨

名称“MyClass”未定义

我也有兴趣学习 Python 的方法。而且我希望pythonic方式不是硬编码东西,默认情况下将其设为nil并稍后检查......

【问题讨论】:

  • 是的,它默认为 nil 并稍后检查。
  • 这绝对是 Pythonic 的方式。默认参数值只计算一次,在方法定义时类名不存在。您还可以考虑将 classmethod 作为替代构造函数。
  • "我希望 pythonic 的方式不是......默认为 nil 并稍后检查" - 你想要修复默认的seed,还是选择一个新的每次一个?如果您每次都想要一个新的,那么您就会被这个选项卡住。
  • 另一方面,如果你想修复它,首先定义seedFrom并使用默认的seed=seedFrom(255),没有selfMyClass
  • 我重新提出了这个问题,因为我认为在定义 __init__ 时只需要调用一次 seedFrom 的情况值得考虑。

标签: python python-3.x


【解决方案1】:

如果你必须在 init 中这样做并且希望种子方法在类上,那么你可以将其设为类方法,例如如下:

class SomeClass(object):

    defaultSeed = 255

    @classmethod
    def seedFrom(cls, seed):
        pass # some seed

    def __init__(self, seed=None):
        self.seedFrom(seed if seed is not None else self.defaultSeed)
        # etc

【讨论】:

  • @chepner 您的编辑虽然不正确,但也不一定是意图。任何“虚假”种子都会导致默认播种,而现在只有不提供种子或显式使用 None 才会产生这种效果。
【解决方案2】:

如果您只需要调用一次seedFrom,您可以在定义__init__ 时这样做。

class MyClass:

    # Defining seedFrom as a function outside
    # the class is also an option. Defining it
    # as a class method is not, since you still
    # have the problem of not having a class to
    # pass as the first argument when it is time
    # to declare __init__
    @staticmethod
    def seedFrom():
        ...

    def __init__(self, seed=seedFrom()):
        ...

【讨论】:

  • 好答案。应该注意,静态方法定义甚至不带类参数(与类方法定义相反)。 [每docs.python.org/2/library/functions.html#staticmethod]
  • 我的错。在我意识到这行不通之前,我开始将它定义为类方法,并忘记从参数列表中删除cls
  • 是的,独立功能可以工作,但是封装呢? ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多