2013-12-03 67 views
1

继SO问题What is a clean, pythonic way to have multiple constructors in Python?Can you list the keyword arguments a Python function receives?我想创建一个基类,它有一个from_yaml类方法,它也可以删除不需要的关键字参数,如下所示。但我认为我需要从基类中引用派生类的__init__方法。我如何在Python中做到这一点?如何从基类中引用Python中派生类的__init__方法?

def get_valid_kwargs(func, args_dict): 
    valid_args = func.func_code.co_varnames[:func.func_code.co_argcount] 
    kwargs_len = len(func.func_defaults) # number of keyword arguments 
    valid_kwargs = valid_args[-kwargs_len:] # because kwargs are last 
    return dict((key, value) for key, value in args_dict.iteritems() 
       if key in valid_kwargs) 


class YamlConstructableClass(object): 
    @classmethod 
    def from_yaml(cls, yaml_filename): 
     file_handle = open(yaml_filename, "r") 
     config_dict = yaml.load(file_handle) 
     valid_kwargs = get_valid_kwargs(AnyDerivedClass.__init__, config_dict) # I don't know the right way to do this 
     return cls(**valid_kwargs) 


class MyDerivedClass(YamlConstructableClass): 
    def __init__(self, some_arg, other_arg): 
     do_stuff(some_arg) 
     self.other_arg = other_arg 

derived_class = MyDerivedClass.from_yaml("my_yaml_file.yaml") 
+0

我需要它的get_valid_kwargs调用 –

+0

是的,发现它。 –

回答

4

你已经有了正确的类的引用:cls

valid_kwargs = get_valid_kwargs(cls.__init__, config_dict) 

类方法被绑定到它被调用的类对象。对于MyDerivedClass.from_yaml()cls未绑定到父类,而是绑定到MyDerivedClass本身。

+0

D'oh!当然! –

相关问题