MagicforestA 2022-07-16 19:04 采纳率: 100%
浏览 35
已结题

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)


  • 写回答

2条回答 默认 最新

  • CSDN专家-showbo 2022-07-16 21:52
    关注

    加这个判断是为了不覆盖原来类中的方法,类中没有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)
     
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月24日
  • 已采纳回答 7月16日
  • 创建了问题 7月16日