有没有一种方法可以通过导入另一个类的实例来获得类名



给定:

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__)

(或者类似的,也许也包含模块名称。)

相关内容

  • 没有找到相关文章

最新更新