一段需要特定抽象数据类型的 Python 代码通常可以传递给模拟该数据类型的方法的类。例如,如果您有一个从文件对象格式化某些数据的函数,您可以定义一个类,其方法为 read() 和 readline(),从字符串缓冲区获取数据,并将其作为参数传递。
考虑这样的事情。
def get_first_line_twice(file):
line = file.readline()
return line + line
这是“一段需要特定抽象数据类型的 Python 代码”。在这种情况下,“特定的抽象数据类型”是一个文件。
“一个模拟该数据类型的方法的类”是指一个类也有一个行为类似的readline()方法。例如。
class Foo:
def readline(self):
return "foo"
我们可以将 Foo 的实例而不是文件传递给我们的第一个函数,它将正常工作。这就是段落的意思。
实例方法对象也有属性:m.__self__是方法m()的实例对象,m.__func__是方法对应的函数对象。
考虑前面示例中的 Foo 类。
f = Foo()
f.readline #the method
f #"the instance object with the method"
f.readline.__self__ is f #True
f.readline.__func__ #"the function object corresponding to the method"
最后一行基本上返回与f 分离的readline。如果我们想调用它,我们实际上需要传递一个对象作为self参数,即f.readline.__func__(f)。或者f.readline.__func__(some_other_object)。这对于高级函数式编程或反射可能很有用。作为初学者,您现在可以忽略这些属性。