当前位置: 首页 > article >正文

Python | 学习type()方法动态创建类

getattr方法的使用场景是在访问不存在的属性时,会触发该方法中的处理逻辑。尤其是在动态属性获取中结合 type()动态创建类有着良好的使用关系。

type()方法常用来判断属性的类别,而动态创建类不常使用,通过如下的几个实例来学习使用:

def say_hello(self):
    print("Hello, I'm an instance of a dynamically created class!")

# 使用type函数创建类
MyClass = type("MyClass", (), {"hello": say_hello})

ttt = MyClass()
ttt.hello()
  • 在这个示例中:
    • 首先定义了一个函数 say_hello,它将作为类的方法。
    • 然后使用 type 函数创建了一个名为 MyClass 的类。type 函数的参数分别是类名"MyClass",父类(这里为空,用()表示),以及类的属性和方法(这里是一个名为"hello"的方法,指向 say_hello 函数)。
    • 最后创建了 MyClass 的一个实例 obj,并调用了 obj.hello()方法。
class BaseClass:

    def __init__(self,name):
        self.name=name
        print(str(self.__class__.__name__)+' begin '+name)

    def base_method(self):
        print("This is a method from the base class.")

def new_method(self):
    print("This is a new method added to the dynamically created class.")

# DynamicClass = type("DynamicClass", (BaseClass,), {"new_attr": "This is a new attribute", "new_method": new_method})
DynamicClass = type("DynamicClass", (BaseClass,), dict(test_demo='this is test',new_attr= "This is a new attribute",  new_method= new_method))
# -------------------------
# 注意 {} 和dict其实用法是一样的
# -------------------------

obj = DynamicClass('testing')
obj.base_method()  # 父类方法
print(obj.test_demo)# 这是一个属性
print(obj.new_attr)# 这是一个属性
obj.new_method()# 这是一个方法

def init_method(self, name):
    self.name = name
    
def say_name(self):
    print(f"My name is {self.name}")

Person = type("Person", (), {"__init__": init_method, "say_name": say_name})

person_obj = Person("Alice")
person_obj.say_name()


http://www.kler.cn/a/465925.html

相关文章:

  • 【每日学点鸿蒙知识】广告ID、NFC手机充值、CSS支持语法、PC与模拟器交互、SO热更新等
  • 4.1.2 栈和队列(一)
  • Linux 基础七 内存
  • Flask是什么?深入解析 Flask 的设计与应用实践
  • 【LeetCode Hot100 二分查找】搜索插入位置、搜索二维矩阵、搜索旋转排序数组、寻找两个正序数组的中位数
  • connect to host github.com port 22: Connection timed out 的解决方法
  • B2B营销的新篇章:开源AI智能名片S2B2C商城小程序的应用探索
  • CDP集成Hudi实战-编译部署
  • gozero框架crm系统中的查询条件动态筛选业务设计与实践
  • unity学习5:创建一个自己的3D项目
  • 04-c++类和对象(下)
  • FreshTomato 路由器固件常见配置以及踩坑记录
  • PyQt5:自定义QListView显示
  • 高质量C++小白教程:2.10-预处理器简介
  • GIT 企业级开发学习 1
  • Emacs折腾日记(七)——布尔变量、逻辑运算符与位运算
  • token、cookie和session
  • 【AIGC】 ChatGPT实战教程:如何高效撰写学术论文引言
  • MR30分布式IO模块助力PLC,打造高效智能仓储系统
  • [redux] useDispatch的两种用法
  • OCR图片中文字识别(Tess4j)
  • Lua开发环境如何安装?保姆级教程
  • 大数据-268 实时数仓 - ODS层 将 Kafka 中的维度表写入 DIM
  • Java编程规约:集合处理
  • 线性变换在机器学习中的应用实例
  • 深入AIGC领域:ChatGPT开发者获取OpenAI API Key的实用指南