如何在python类中将方法名称作为参数传递
Posted
技术标签:
【中文标题】如何在python类中将方法名称作为参数传递【英文标题】:how to pass method name as a parameter in python class 【发布时间】:2017-10-12 04:39:44 【问题描述】:这是我的代码,我的目的是在初始化对象时将方法名称作为参数传递,并且我想运行方法“num”(第二个参数)次。基本上得到 n 个结果(如第二个参数中所述)。
class Foo(object):
faker = Faker()
def __init__(self, custom_method, num=1):
self.values = []
self.custom_method = custom_method
self.num = num
for x in self.num:
self.custom_method = self.values.append(custom_method)
def random_first_name(self):
self.custom_method = self.faker.first.name()
return self.custom_method
def random_phone(self):
self.custom_method = self.faker.random.phone()
return self.custom_method
b = Foo(random_first_name, 1)
c = Foo(random_phone,2)
【问题讨论】:
你实际上并没有调用“custom_method”,所以很难知道你在期待什么 【参考方案1】:我猜你可能想使用函数getattr
。
class Foo(object):
faker = Faker()
def __init__(self, custom_method, num=1):
self.custom_method = custom_method
self.num = num
@property # Briefly, the property decorator makes the job of calling the callable for you. I.e. There is no need to do self.method(), self.method is enough.
def random_first_name(self):
return self.faker.first.name()
@property
def random_phone(self):
return self.faker.random.phone()
def call_method_num_times(self):
return [getattr(self, self.custom_method)\
for _ in range(self.num)]
我不能实例化这个类,但是可以这样使用:
>>> foo1 = Foo('random_first_name', 1)
>>> foo1.call_method_num_times()
['John']
>>> foo2 = Foo('random_phone', 2)
>>> foo2.call_method_num_times()
['0123456789', '9876543210']
为了(甚至更多)以(主观上)更好的方式重组你的班级,我会做
class Foo(object):
def __init__(self):
self.faker = Faker()
@property
def random_first_name(self):
return self.faker.first.name()
@property
def random_phone(self):
return self.faker.random.phone()
def call_method_num_times(self, custom_method, num=1):
return [getattr(self, custom_method)\
for _ in range(num)]
因此允许您只实例化一次Foo
>>> foo = Foo()
>>> foo.call_method_num_times('random_first_name')
['John']
>>> foo.call_method_num_times('random_phone', 2)
['0123456789', '9876543210']
如果您对使用 python 原生
property
描述符不满意,您可以将您的两个方法保留为显式方法。在这种情况下,您将定义类 Foo
如下
class Foo(object):
def __init__(self):
self.faker = Faker()
def random_first_name(self):
return self.faker.first.name()
def random_phone(self):
return self.faker.random.phone()
def call_method_num_times(self, custom_method, num=1):
return [getattr(self, custom_method)()\
for _ in range(num)]
这不会改变使用Foo
的方式
>>> foo = Foo()
>>> foo.call_method_num_times('random_first_name')
['John']
>>> foo.call_method_num_times('random_phone', 2)
['0123456789', '9876543210']
【讨论】:
可能值得注意的是,您可以使用getattr(self, custom_method)()
来代替引入描述符
谢谢@Tnerual
@Tnerual 我将对象实例化为 json 字典键的值。有什么方法可以不做f = Foo('custom_method_1', 2)
f.call_method_num_times()
@new_kid_07。最好的可能是问另一个问题,参考这个问题以便给出上下文。如果您有这个问题,则意味着更广泛的社区很可能也有这个问题。以上是关于如何在python类中将方法名称作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章