gpt4 book ai didi

Python 的 define_method 等价物

转载 作者:数据小太阳 更新时间:2023-10-29 08:59:59 27 4
gpt4 key购买 nike

我在 ruby​​ 中有这段代码:

class Package

def initialize(name)
@name = name
@elements = []
end

[:type, :block].each do |bindtype|
define_method "get_#{bindtype}_by_name" do |name|
get_by_name(name, bindtype)
end
end

def get_by_name(name, bindtype=nil)
@elements.each do |element|
return if element.name == name
end
return nil
end

我读过这个问题 about define_method in python我想用我的 Ruby 代码在 Python 中实现同样的事情:

bindtypes = {"type", "block"}

class Package:

def __init__(self, name):
self.name = name
self.elements = list()

def get_by_name(self, name, bindtype=None):
for element in self.elements:
if element.name == name:
return element
return None

for bindtype in bindtypes:
def _in_bindtype(self, bindtype, bindtype):
Package.get_by_name(bindtype, bindtype)
setattr(Package, "get_"+bindtype+"_by_name", _in_bindtype

我这样调用函数:

package = Package("package")    
block = Block("blockName")
package.elements.append(block)
blockFound = package.get_block_by_name(block.name, block.bindtype)

但显然这不起作用,因为我没有恢复正在搜索的元素的名称。有人可以帮助我更好地理解这个 python define_method 如何与我的代码一起工作吗?

最佳答案

你快到了;将 bindtype 值绑定(bind)为函数参数的默认值,并且您想在 self 上调用 get_by_name():

for bindtype in bindtypes:
def _in_bindtype(self, name, bindtype=bindtype):
self.get_by_name(name, bindtype)
setattr(Package, "get_{}_by_name".format(bindtype), _in_bindtype)

我冒昧地使用 str.format() 来格式化方法名称,而不是使用 + 连接,我发现它更具可读性。

或者,在 Python 3 中,您可以只创建 functools.partialmethod() objects :

from functools import partialmethod

for bindtype in bindtypes:
setattr(Package, "get_{}_by_name".format(bindtype),
partialmethod(Package.get_by_name, bindtype=bindtype))

关于Python 的 define_method 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38060773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com