给定:
Module A.py
class utilities:
def __init__(self):
#Is there a way to get the class that instantiates this constructor ? But here, in the init method?
def utilMethod(self):
pass
Module B.py
from A import utilities
class dummy:
utils = utilities()
def dummyMthod(self):
utils.utilMethod()
#有没有一种方法可以获得实例化实用程序类构造函数的类?但是在正在实例化的类的init方法中?
由于您将utils
实例化为一个静态变量,因此在创建它时,类dummy还不可用,因此答案是"否":你不能那样做。
替代方案:";把自己传给";(有关说明,请参阅代码注释)
class utilities:
def __init__(self):
pass
def utilMethod(self, obj): # the caller is passed in
print(obj.__class__.__name__) # this is how we can access the class-name of the caller
pass
class dummy:
utils = utilities()
def dummyMthod(self):
self.utils.utilMethod(self) # here we "pass ourselves in"
d = dummy()
d.dummyMthod() # prints "dummy"
更新
如果我们想将utils
声明为对象属性(与前面片段中的静态类属性相比),我们可以执行以下操作:
class utilities:
def __init__(self, obj):
print(obj.__class__.__name__)
pass
def utilMethod(self, obj):
pass
class dummy:
def __init__(self):
self.utils = utilities(self) # declare utils as object attribute inside the constructor and pass 'self' into utilities
def dummyMthod(self):
self.utils.utilMethod()
d = dummy() # prints "dummy"
在__init__
中(通常在类的方法中),可以使用self.__class__
和/或self.__class__.__name__
;后者对于日志记录和类似消息特别有用。
self.logger = logging.getLogger(self.__class__.__name__)
(或者类似的,也许也包含模块名称。)