我试图从封装类中获取一个封装类的上下文,比如一个标签。一种方法是传递标签,就像我在下面演示的实例化过程中一样。你知道吗
我已经了解了日志模块如何允许您使用get\u logger函数订阅子日志,并且我希望有一个get\u context()函数。有什么办法吗?你知道吗
如果这个标签的传递达到了一个水平,就像下面的YetAnotherClass,它看起来是可以忍受的。。。但是如果你必须把它往下传3到4级,那就是我真正想要的另一个解决方案来传递这个标签的地方。你知道吗
我应该换个角度考虑这个问题吗?下面是一些示例代码:
class RootClass(object) :
def __init__(self) :
self.ac = AnotherClass('root_class_context')
def do_insert(self) :
""" use DataTableMgr class to update table """
self.ac.insert_to_table('field1', 'field2', 'field3')
class AnotherClass(object) :
def __init__(self, label) :
self.context = label
self.dtm = DataTableMgr('arg1','arg2', 'arg3', 'arg4', self.context)
def insert_to_table(self, field1, field2, field3) :
""" insert args to database using DataTableMgr """
self.dtm.insert_to_table(field1, field2, field3)
class YetAnotherClass(object) :
def __init__(self) :
self.dtm = DataTableMgr('arg1','arg2', 'arg3', 'arg4', 'yetanother_context')
def do_insert(self) :
""" use DataTableMgr class to update table """
self.dtm.insert_to_table('field1', 'field2', 'field3')
class DataTableMgr(object) :
""" manage insert, updates to some table """
def __init__(self, arg1, arg2, arg3, arg4, user_id) :
self.context = user_id
def insert_to_table(self, field1, field2, field3) :
""" insert fields to table, while updating user id"""
print( "inserting...(pretending to be updating sql database)")
print(field1, field2, field3, self.context)
print
if __name__ == "__main__" :
#instantiate a class once removed from the inserting class and do insert
rc = RootClass()
rc.do_insert()
#instantiate a class directly accessing the class for inserting
yac = YetAnotherClass()
yac.do_insert()
#note how the context changes
print
print("Notice how the context changes? "
".. is there a better way to pass around this context information?")
我能想到的最简单的方法就是使用继承:
但也许您不想使用继承,因为
RootClass
不是DataTableMgr
,而是有一个DataTableMgr
。 在这种情况下,您可以考虑使用多态性将上下文传递给委托的封装对象。你知道吗为了促进多态性,委托对象应该可以通过
self.dtm
访问。因此,当调用do_insert
时,委托对象self.dtm
调用其insert_to_table
方法。如果self.dtm
是DataTableMgr
实例,则调用DataTableMgr.insert_to_table
。但是如果self.dtm
是另一个Base
实例,则调用委托的insert_to_table
方法。以此类推,直到委托是DataTableMgr
。你知道吗下面是一个可运行代码的示例:
相关问题 更多 >
编程相关推荐