如何在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类中将方法名称作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

在python 3中将参数传递给exec

如何在 VB NET 中将方法名称作为过程的参数传递

在辅助方法中将 self 作为参数传递

在 Python 3.5+ 中将格式字符串作为关键字参数传递的替代方法

python怎么传参

如何在Java中将泛型对象作为方法参数传递? [复制]