在 Python 中的普通函数中使用基于对象的函数

Using an Object based Function within a normal Function in Python

我试图在(普通)函数中调用面向对象的函数。我直接对对象使用(正常)函数。首先,外部(正常)函数接受对象这一事实对我来说似乎有点违反直觉。其次,我得到的错误是基于内部对象的函数无法获取对象作为参考。这是代码:

class Node:
 def __init__(self, time):
    self.time = time


# list to create objects of class Node
sequence = []
for i in range(5): sequence.append(Node(i * 5))


# object based function, created outside the class, and linked to it
def get_time(self):
    return self.time

Node.get_time = get_time()

# output array
arr = [0 for i in range(5)]

# non-object based function, uses object based function to populate arr
def getter(x):
    arr[x] = get_time()

# implementation
for y in range(5):
    sequence[y].getter(y)

for z in range(5): print(arr[z])

我得到的错误是 - TypeError: get_time() missing 1 required positional argument: 'self' 任何澄清表示赞赏!

这会执行您的代码似乎尝试执行的所有操作:

class Node:
    def __init__(self, time):
        self.time = time

    def get_time(self):
        return self.time


sequence = [Node(i * 5) for i in range(5)]

arr = [node.get_time() for node in sequence]

print(arr)

但是,虽然您通常会定义一个 方法 (一个函数是 class 的一部分并在 class 的实例上运行),例如在上面的示例中,您 也可以 稍后定义它,尽管通常不需要。

这样的函数会将它操作的对象作为第一个参数传递,这就是为什么 get_timeself 作为第一个参数的原因 - 它可以被称为任何东西,但是 self 是 Python.

中的约定

所以,这也是一样的:

class Node:
    def __init__(self, time):
        self.time = time


def get_time(self):
    return self.time


# note: "get_time", not "get_time()", assigning the function itself, not the result
Node.get_time = get_time

sequence = [Node(i * 5) for i in range(5)]

arr = [node.get_time() for node in sequence]

print(arr)

但是,如果您以后继承自 Node,它可能会给您带来问题,并且您的编辑器可能并不总是知道 get_time 现在是 Node 的方法并生成警告.除非必须,否则不要这样做。

回答你的问题:因为 get_item 被分配给 Node.get_item 并且它是一个函数,它现在作为 class 上的方法工作,因此它被调用class Node 的对象作为其第一个参数,当调用该对象时。

如果你想让一个函数访问对象及其内容(属性和方法),它需要知道对象及其内容class,但它可以像这样访问它:

def get_all_times(nodes):
    return [node.get_time() for node in nodes]


arr = get_all_times(sequence)

无论您在何处访问 class 的实例,它都将具有定义的属性和方法,您不需要任何特殊的东西来访问它们(除了知道它们在那里)。