当前位置: 首页 > 面试题库 >

我如何为python中的类动态创建类方法

杜浩壤
2023-03-14
问题内容

如果我定义一个小python程序为

class a():
    def _func(self):
        return "asdf"

    # Not sure what to resplace __init__ with so that a.func will return asdf
    def __init__(self, *args, **kwargs):
         setattr(self, 'func', classmethod(self._func))

if __name__ == "__main__":
    a.func

我收到回溯错误

Traceback (most recent call last):
  File "setattr_static.py", line 9, in <module>
    a.func
AttributeError: class a has no attribute 'func'

我要弄清楚的是,如何在不实例化对象的情况下动态地将类方法设置为类?

编辑:

这个问题的答案是

class a():
    pass

def func(cls, some_other_argument):
    return some_other_argument

setattr(a, 'func', classmethod(func))

if __name__ == "__main__":
    print(a.func)
    print(a.func("asdf"))

返回以下输出

<bound method type.func of <class '__main__.a'>>
asdf

问题答案:

您可以通过简单地分配给类对象或通过对类对象的setattr动态地将类方法添加到类中。在这里,我使用python约定,即类以大写字母开头,以减少混乱:

# define a class object (your class may be more complicated than this...)
class A(object):
    pass

# a class method takes the class object as its first variable
def func(cls):
    print 'I am a class method'

# you can just add it to the class if you already know the name you want to use
A.func = classmethod(func)

# or you can auto-generate the name and set it this way
the_name = 'other_func' 
setattr(A, the_name, classmethod(func))


 类似资料:
  • 问题内容: 我需要动态创建一个类。为了更详细,我需要动态创建Django类的子类。 通过“动态”,我打算基于用户提供的配置创建一个类。 例如 我想要一个命名为该类的子类的类。 该类应具有所选属性的列表。 ....在这种情况下 有什么有用的提示吗?:) 问题答案: 您可以通过调用内置函数并传递适当的参数来动态创建类,例如: 它适用于新型类。我不确定这是否也适用于老式类。

  • 问题内容: 我有类名称的列表,想动态创建它们的实例。例如: 如何在Python中动态创建该实例?谢谢! 问题答案: 这通常被称为反思或自省。找出类似的问题,这些问题可以回答您要尝试做的事情: Python是否具有与Java类forname等效的名称 您可以使用字符串实例化Python中的类吗

  • 我们知道,type() 函数属于 Python 内置函数,通常用来查看某个变量的具体类型。其实,type() 函数还有一个更高级的用法,即创建一个自定义类型(也就是创建一个类)。 type() 函数的语法格式有 2 种,分别如下: type(obj)  type(name, bases, dict) 以上这 2 种语法格式,各参数的含义及功能分别是: 第一种语法格式用来查看某个变量(类对象)的具体

  • 问题内容: 我们需要创建SQLAlchemy类来访问多个外部数据源,这些数据源会随着时间的推移而增加。我们为核心ORM模型使用了声明式基础,并且我知道我们可以使用autoload = True手动指定新的ORM类,以自动生成映射。 问题是我们需要能够采用以下方式动态生成它们: 并动态地将其转换为如下所示: 我们不希望类的持久时间长于打开连接,执行查询然后关闭连接所需的时间。因此,理想情况下,我们可

  • 问题内容: 给定一个类名,我想动态创建一个Groovy类,向其添加属性和方法。我使用创建新类 对于我使用的方法 其中it.key是字符串(方法名),it.value是闭包。这很方便,因为我可以指定方法参数类型并进行类型检查。但是,如果不给它赋值,就无法指定动态创建的属性类型。我可以通过显式定义属性的getter和setter来解决此问题。这可行,但是metaClass.name = value或m

  • 问题内容: 说有: 这里可能是和是 不是 : 我该怎么办,通话不会触发? 换句话说,我知道可以在运行时手动将类方法添加到类中。但是是否有可能自动执行此操作,比如说每当缺少类方法时,它都会创建一些虚拟方法? 换句话说,只有当我可以用我的字典来代替时,它才能处理-但似乎不可写… 问题答案: 您可以通过使用metaclass上的钩子来实现。 演示: 请注意,我们将调用结果直接设置到该类上,有效地将其缓存