在Python中,将class属性作为该类函数的参数传递

2024-05-16 15:54:56 发布

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

正如标题所示,我试图将类的属性作为同一类函数的参数传递。在下面的示例中,print_top_n()的功能默认是打印self.topn,但如果需要,也可以使用不同的值调用该函数。这是Python(或通用编程)犯规,还是有办法做到这一点?在

>>> class Example():
    def __init__(self, topn=5):
        self.topn = topn
    def print_top_n(self, n=self.topn):
        print n



Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    class Example():
  File "<pyshell#7>", line 4, in Example
    def print_top_n(self, n=self.topn):
NameError: name 'self' is not defined

Tags: 函数inself标题属性exampletopdef
3条回答

一种选择是使用标记对象。这是一个比n=None(取决于api的实际意图)更好的模式,因为即使有人故意传递n=None,它也能工作。在

marker = object()

class Example:
    def __init__(self, topn=5):
        self.topn = topn

    def print_top_n(self, n=marker):
        if n is marker:
            n = self.topn
        print(n)

否;定义函数时会计算默认值,因此没有对象需要对其执行属性访问。而是使用sentinel值:

def print_top_n(self, n=None):
    if n is None:
        n = self.topn
    print n

方法是在创建类时创建的,而默认值是在创建方法时设置的(请参见question/answer),在调用函数时不会重新评估它们。换句话说,这一切都发生在self创建之前(因此NameError)。在

典型的方法是使用一个sentinel值,您可以在print_top_n内部进行检查(None是最常见的)。在

def print_top_n(self, n=None):
    n = self.topn if n is None else n
    print n

相关问题 更多 >