python元编程问题

提问在下方注释里

import time

def get_class_instantiation_time(self):
    return self.class_instantiation_time

class CleanCodeGuard(type):
    classes_created = []

    def __new__(mcs, name, bases, dictionary):
        if 'get_class_instantiation_time' not in dictionary:
            dictionary['get_class_instantiation_time'] = get_class_instantiation_time
"""        
为什么要加这2行ifstatement,直接obj.get_class_instantiation_time = time.time()不就可以了吗,然后 obj.class_instantiation_time = time.time()不就可以省略了
"""
        obj = super().__new__(mcs, name, bases, dictionary)

        obj.class_instantiation_time = time.time()
        CleanCodeGuard.classes_created.append(name)
        
        time.sleep(1)
        return obj

class My_Class1(metaclass=CleanCodeGuard):
    pass

class My_Class2(metaclass=CleanCodeGuard):
    pass

my_object1 = My_Class1()
print(my_object1.get_class_instantiation_time())

my_object2 = My_Class2()
print(my_object2.get_class_instantiation_time())

print(CleanCodeGuard.classes_created)


加这个判断是为了不覆盖原来类中的方法,类中没有get_class_instantiation_time的话再给类实例添加get_class_instantiation_time方法,简单示例如下

import time
 
def get_class_instantiation_time(self):
    return self.class_instantiation_time
 
class CleanCodeGuard(type):
    classes_created = []
    def __new__(mcs, name, bases, dictionary):
        if 'get_class_instantiation_time' not in dictionary:
            dictionary['get_class_instantiation_time'] = get_class_instantiation_time

        obj = super().__new__(mcs, name, bases, dictionary)
 
        obj.class_instantiation_time = time.time()
        CleanCodeGuard.classes_created.append(name)
        
        time.sleep(1)
        return obj
 
class My_Class1(metaclass=CleanCodeGuard):
    def get_class_instantiation_time(sefl):
        return "get_class_instantiation_time--My_Class1"
 
class My_Class2(metaclass=CleanCodeGuard):
    pass
 
my_object1 = My_Class1()

print(my_object1.get_class_instantiation_time())#这里打印的是get_class_instantiation_time--My_Class1,而非类创建的时间
 
my_object2 = My_Class2()
print(my_object2.get_class_instantiation_time())
 
print(CleanCodeGuard.classes_created)
 
 

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632