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

Python动态类方法

冯澄邈
2023-03-14
问题内容

说有:

class A(B):
    ...

这里B可能是object...不是

@classmethod # or @staticmethod
def c(cls): print 'Hello from c!'

我该怎么办,通话A.c()不会触发AttributeError

换句话说,我知道可以在运行时手动将类方法添加到类中。但是是否有可能自动执行此操作,比如说每当缺少类方法时,它都会创建一些虚拟方法?

换句话说,只有当我可以A.__dict__用我的字典来代替时,它才能处理__getitem__-但A.__dict__似乎不可写…


问题答案:

您可以通过使用metaclass上的__getattr__钩子来实现。

class DefaultClassMethods(type):
    def __getattr__(cls, attr):
        def _defaultClassMethod(cls):
            print 'Hi, I am the default class method!'
        setattr(cls, attr, classmethod(_defaultClassMethod))
        return getattr(cls, attr)

演示:

>>> class DefaultClassMethods(type):
...     def __getattr__(cls, attr):
...         def _defaultClassMethod(cls):
...             print 'Hi, I am the default class method!'
...         setattr(cls, attr, classmethod(_defaultClassMethod))
...         return getattr(cls, attr)
... 
>>> class A(object):
...     __metaclass__ = DefaultClassMethods
... 
>>> A.spam
<bound method DefaultClassMethods._defaultClassMethod of <class '__main__.A'>>
>>> A.spam()
Hi, I am the default class method!

请注意,我们将classmethod调用结果直接设置到该类上,有效地将其缓存以供将来查找。

如果您需要在每次调用时重新生成类方法,请使用相同的方法将函数绑定到实例,但是将类和元类绑定到实例(cls.__metaclass__与元类子类保持一致):

from types import MethodType

class DefaultClassMethods(type):
    def __getattr__(cls, attr):
        def _defaultClassMethod(cls):
            print 'Hi, I am the default class method!'
        return _defaultClassMethod.__get__(cls, cls.__metaclass__)

对于静态方法,只需在所有情况下直接返回该函数,而无需使用staticmethod装饰器或描述符协议。



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

  • 问题内容: 如果我定义一个小python程序为 我收到回溯错误 我要弄清楚的是,如何在不实例化对象的情况下动态地将类方法设置为类? 编辑: 这个问题的答案是 返回以下输出 问题答案: 您可以通过简单地分配给类对象或通过对类对象的setattr动态地将类方法添加到类中。在这里,我使用python约定,即类以大写字母开头,以减少混乱:

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

  • 2.1.3 Python 的动态类型* 如果将计算机内存单元比喻成宾馆的房间,那么编程语言中的变量可以理解成这些房间的“门牌标识”。将一个数据存入变量,实际上是存入该变量所标识的内存单元;而访问一 个变量,当然就是访问该变量所标识的内存单元中的数据。 绝大多数编程语言中对变量的使用有严格的类型限制,一个变量固定作为某内存单元的 标识,并且该单元只能存储特定类型的数据。这就好比宾馆的房间分为客房、员

  • 本文向大家介绍python的类方法和静态方法,包括了python的类方法和静态方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python的类方法和静态方法。分享给大家供大家参考。具体分析如下: python没有和C++中static关键字,它的静态方法是怎样的呢?还有其它语言中少有的类方法又是神马? python中实现静态方法和类方法都是依赖于python的修饰器来实现的。 大家注意

  • 动态类型(dynamic typing)是Python另一个重要的核心概念。我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值。这些都与动态类型的概念相关。 动态类型 在我们接触的对象中,有一类特殊的对象,是用于存储数据的。常见的该类对象包括各种数字,字符串,表,词典。在C语言中,我们称这样一些数据结构为变量。而在Python中,这些是对象。 对象