2017-01-23 92 views
0

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

回答

1

创建类时创建的方法,并在创建方法时的默认值设置(见本question/answer) - 他们没有重新evaluted当函数被调用。换句话说,这一切都在self被创建之前很久(因此NameError)。

典型的方法是使用可在print_top_nNone是最常见的)中检查的标记值。

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

不;当功能被定义时,默认值被评估,所以没有对象还没有对其执行属性访问。您可以使用标记值代替:

def print_top_n(self, n=None): 
    if n is None: 
     n = self.topn 
    print n 
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) 
相关问题