如果是别的py中来的就使用getattr,是本py的就用globals
# encoding: utf-8
# @File : attempt003.py
# @Author: mu
# @Desc :
# @Date : 2024/10/24
'''
这个和attemtp001.py有关联
同样使用getattr()函数,但感觉这个函数用法很多,同样的效果可以用不同的方法实现
'''
class Dog:
def __init__(self,name):
self.name=name
def speak(self):
print("wangwang",self.name)
class Cat:
def __init__(self,name):
self.name=name
def speak(self):
print("miaomiao",self.name)
#定义 动态实例化类的函数
def dynamic_class_instantiation(class_name,*args,**kwargs):
#获取类的引用
cls = globals()[class_name]
# cls = globals().get(class_name) #这两个方式起到了一样的效果
if cls is None:
raise ValueError("class not found")
#动态实例化类
instance = cls(*args,**kwargs)
return instance
if __name__ == '__main__':
print("begin")
animal_name = "Dog"
animal = dynamic_class_instantiation(animal_name, "Buddy")
print(animal.speak()) #这个打印结果为什么有个None?
print("end")
# encoding: utf-8
# @File : attempt004.py
# @Author: mu
# @Desc :
# @Date : 2024/10/24
import my_module_temp
def dynamic_class_instantiation(module, class_name, *args, **kwargs):
cls = getattr(module, class_name, None) # 从 my_module 获取 class_name 对应的类
if cls is None:
raise ValueError(f"Class {class_name} not found in module {module}.")
instance = cls(*args, **kwargs) # 动态实例化
return instance
if __name__ == '__main__':
animal = dynamic_class_instantiation(my_module_temp, "Dog", "Buddy")
print(animal.speak()) # 输出: Buddy says woof!
还有一种方法,我不太会用
# encoding: utf-8
# @File : attempt002.py
# @Author: mu
# @Desc :
# @Date : 2024/10/24
'''
使用元类动态创建实例
元类是定义类的类
允许在运行时动态的创建和修改类
在上面的示例中,我们首先定义了一个元类MyMetaClass,它继承了type类并重写了__call__方法。__call__方法在使用类的名称创建实例时被调用。
然后,我们定义了一个名为MyClass的类,并指定它的元类为MyMetaClass。当我们使用类的名称MyClass创建实例时,元类的__call__方法将被调用,并返回一个通过super().__call__创建的实例。
'''
class MyMetaClass(type):
def __call__(self, name):
instance = super().__call__(name)
return instance
class Myclass(metaclass=MyMetaClass):
def __init__(self,name):
self.name=name
def say_hello(self):
print("hello",self.name)
if __name__ == '__main__':
my_instance = Myclass("mu")
my_instance.say_hello()
print("begin")