添加方法到动态创建的类,调用' super'

时间:2014-04-07 16:19:35

标签: python python-2.7 metaclass

我需要创建一个动态生成的类,其中包含一个调用其父方法的方法。

动态创建类的常用方法如下:

# I have a class ClassA...
class ClassA(object):
  def print_something(self):
    print('I am a method defined in ClassA')

# ... and I want to create a dynamically created class that inherits from ClassA
def class_s_factory(print_str):
  def print_something(self):
    print('I am a method defined in ClassS')
    print(print_str)
  cls = type('ClassS', (ClassA, ), {'print_something': print_something})
  return cls

# I can finally create an instance of ClassS and use the 'print_something' method

# Get a string from the database (for example)
print_str_database = 'I am a string from the database'

test_class = class_s_factory(print_str_database)
test_instance = test_class()
test_instance.print_something()

# This will print
# I am a method defined in ClassS
# I am a string from the database

如果我想在print_something中调用父方法,该怎么办? 我该怎么改变它?例如:

def print_something(self):
  # CALL PARENT'S METHOD HERE! HOW?
  print('I am a method defined in ClassS')
  print(print_str)

我想要以下输出

# I am a method defined in ClassA
# I am a method defined in ClassS
# I am a string from the database

我尝试了一些我建议的答案。它有效,但有没有更好的方法来处理这种情况?

1 个答案:

答案 0 :(得分:0)

这是我最终尝试的内容,并且有效:

class ClassA(object):
  def print_something(self):
    print('I am a method defined in ClassA')

# Create a factory for classes.
# Each class has a method that depends on the string given
# This method needs to call its parent's method
def class_s_factory(print_str):
  def add_print_something(cls):
     def print_something(self):
       super(cls, self).print_something()
       print('I am a method defined in ClassS')
       print(print_str)
     setattr(cls, 'print_something', print_something)

  cls = type('ClassS', (ClassA, ), {})
  add_print_something(cls)
  return cls

# Get a string from the database (for example)
print_str_database = 'I am a string from the database'

test_class = class_s_factory(print_str_database)
test_instance = test_class()
test_instance.print_something()

然而,原则上可能存在获得相同结果的更好方法。