在 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_time
将 self
作为第一个参数的原因 - 它可以被称为任何东西,但是 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 的实例,它都将具有定义的属性和方法,您不需要任何特殊的东西来访问它们(除了知道它们在那里)。
我试图在(普通)函数中调用面向对象的函数。我直接对对象使用(正常)函数。首先,外部(正常)函数接受对象这一事实对我来说似乎有点违反直觉。其次,我得到的错误是基于内部对象的函数无法获取对象作为参考。这是代码:
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_time
将 self
作为第一个参数的原因 - 它可以被称为任何东西,但是 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 的实例,它都将具有定义的属性和方法,您不需要任何特殊的东西来访问它们(除了知道它们在那里)。