python - 如何在python元编程中使用实例方法?

标签 python metaprogramming metaclass

我有一个类A:

class A(object):
  a = 'a'
  def __init__(self):
    self.b = 'b'
  def foo(self):
    print A.a
    print self.b

我只是想知道如何通过元编程构造这个类。

我试过:

def Init(self):
  self.b = 'b' 

def Foo(self):
  print A_CLASS.a
  print self.b

A_CLASS = type('A_CLASS',(object,),{'a':'a','__init__':Init,'foo':Foo})

myObj = A_CLASS()
myObj.foo()

可以用了,但是还是有问题,就是我必须用A_CLASS作为类名,如果用B_CLASS就不行工作了:

B_CLASS = type('A_CLASS',(object,),{'a':'a','__init__':Init,'foo':Foo})

myObj = B_CLASS()
myObj.foo() #Error ocurred

如果有一种方法可以构建这样一个类,其中变量“X_CLASS”的名称根本不相关?

最佳答案

您的错误发生是因为 Foo 无条件引用 A_CLASS,但您将该类绑定(bind)到全局名称 B_CLASS。这在其他情况下会成为一个问题(pickle 依赖于类名与其在定义模块中绑定(bind)的名称相匹配),但对于这种有限的情况,它是可以修复的。不要直接引用 A_CLASS.a,而是根据 self 引用它:

def Foo(self):
  print self.a
  print self.b
如果不存在该名称的实例属性,

self 将查找类属性。如果您想 100% 确定它来自类,而不是实例,您可以将其定义为:

def Foo(self):
  # New-style class only, but safe against weirdness like redefining __class__
  print type(self).a
  # Old-style class, and vast majority of non-pathological new-style classes
  print self.__class__.a

  print self.b

查找类,然后从类中获取属性,绕过实例属性。

在继承层次结构中,这可能是错误的。如果存在具有不同 a 类属性的 A_CHILD 类,则对其调用 Foo 将获得子属性。但这是违反规则的代价;如果你给一个类命名 A_CLASS 并将它绑定(bind)到名称 B_CLASS,你不能通过名称 A_CLASS 来引用它进行查找(因为您的程序中没有任何部分具有该绑定(bind))。

关于python - 如何在python元编程中使用实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48635192/

相关文章:

python - 热图像处理

python - 计算数据框中的多个值

Ruby 类 << Klass = Module::new

c++ - 遍历 boost::mpl::list 的惯用方法是什么?

java - 动态添加 IntegerMetaClass 到 GroovyShell

python - 如何在 python 中随机洗牌数据和目标?

python - Atom 中的 "Script"在哪里?

ruby - 如何在运行时在 ruby​​ 中设置命名空间?

python - 在 Python 3 中确定类的元类

python : counting module imports?