Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中将class属性作为该类函数的参数传递_Python_Python 2.7 - Fatal编程技术网

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

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

正如标题所示,我试图将类的属性作为同一类的函数的参数传递。在下面的示例中,
print\u 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
>>类示例()
定义初始化(self,topn=5):
self.topn=topn
def print_top_n(self,n=self.topn):
印刷品
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
类示例():
例如,文件“”,第4行
def print_top_n(self,n=self.topn):
NameError:未定义名称“self”

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

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

一个选项是使用标记对象。这是一种比
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)

这些方法是在创建类时创建的,默认值是在创建方法时设置的(请参见此)——调用函数时不会重新求值。换句话说,这一切都发生在
self
创建之前很久(因此出现
namererror

典型的方法是使用sentinel值,您可以在
print\u top\n
中检查该值(最常见的是
None

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