Python在初始化时声明对象函数
假设我有一个传递了一组选项的类 例如:Python在初始化时声明对象函数,python,Python,假设我有一个传递了一组选项的类 例如: class Thing(object): def __init__(self, options): self.name = options['name'] if options['material'] == 'organic': self.living = options['living'] if self.living: se
class Thing(object):
def __init__(self, options):
self.name = options['name']
if options['material'] == 'organic':
self.living = options['living']
if self.living:
self.kingdom = options['kingdom']
else:
self.material = options['material']
因此,如果它是物质和有机的,它将有一个额外的选项,指定它是否存在,如果它存在,它还将有一个王国等等
假设我想在类Thing
中定义一个函数,例如:
def belongToKingdom(self):
print self.kingdom
但我只希望在
\uuuu init\uuuu
中定义这样一个函数,如果在选项中传递了kingdom,则忽略它。正确的方法是什么 有一个子类类LivingThing(Thing):
?是的,我知道,它只是一个简化的例子,实际的用例有点不同,因为有一组函数是由成对值数组动态生成的。所以我不能只为每一个可能的对的组合创建子类,我实际上需要一个标准的原型函数,并用一些由值对决定的变量生成它。这可能适用于不同的问题,但是,假设我不知道要定义的函数将被调用,有没有办法对函数名进行str格式化?也就是说,self.belongTo{0}.format(options['kingdom'])@user3467349的工作等价物我真的搞不懂你在问什么,但听起来你好像在试图把有意义的数据放在变量名中。不要那样做!只需构建一个选项列表,这样Thing().options
就会返回{'living':True,'kingdom':“Animal”,…}
并测试it@user3467349但当然,事实上,有一种方法可以做你想做的事。与其操纵self
,不如操纵self.\uuu dict\uuu
。然后可以使用字符串而不是变量名。例如:self.[belongTo{}.format('kingdom')]=lambda self:print(self.kingdom)
works(它比sin更丑陋)是的,我刚刚想到了。我也可以直接制作一本新字典,即self.printMyAttribute={},然后添加到字典中,使它看起来像{'kingdom':}等等。你有什么理由不鼓励这样的事情吗?@AdamSmith这行不通belongToKingdom
是一个函数,与方法不同。然后需要进行赋值self.belongToKingdom=MethodType(belongToKingdom,self)
class Thing(object):
def __init__(self, **options):
if options.get('living',None):
def belongToKingdom(self):
print(self.kingdom)
self.kingdom = options['kingdom']
self.belongToKingdom = belongToKingdom