kbe常用宏展开示例(INSTANCE_SCRIPT_HREADER)

本文详细介绍了如何在Python中通过子类化实现特定的操作填充,特别聚焦于将操作封装到派生类中,如ClientObjectBase,以实现自定义的类型方法、属性获取和设置等高级功能。

子类化  将一些py操作填充进派生类 

类:class ClientObjectBase:public script::ScriptObject  属于脚本导出类

宏操作展开为:

    static PyTypeObject _scriptType; 

	typedef ClientObjectBase ThisClass; 

	static PyObject* _tp_repr(PyObject* self) { 
		return static_cast<ClientObjectBase*>(self)->tp_repr(); } 

	static PyObject* _tp_str(PyObject* self) { 
		return static_cast<ClientObjectBase*>(self)->tp_str(); } 
	
	static PyObject* _tp_new(PyTypeObject* type, PyObject* args, PyObject* kwds) { 
	    return ClientObjectBase::tp_new(type, args, kwds); } 

	static PyObject* _tp_getattro(PyObject* self, PyObject* name) { 
	    return static_cast<ClientObjectBase*>(self)->onScriptGetAttribute(name); }
 
	static int _tp_setattro(PyObject* self, PyObject* name, PyObject* value) { 
	    return (value != 0) ? 
        static_cast<ClientObjectBase*>(self)->onScriptSetAttribute(name, value): 
	    static_cast<ClientObjectBase*>(self)->onScriptDelAttribute(name); } 

	static int _tp_init(PyObject* self, PyObject *args, PyObject* kwds) { 
	    return static_cast<ClientObjectBase*>(self)->onScriptInit(self, args, kwds); } 
	
	public: 
    static PyMethodDef* _ClientObjectBase_lpScriptmethods;
	static PyMemberDef* _ClientObjectBase_lpScriptmembers; 
	static PyGetSetDef* _ClientObjectBase_lpgetseters; 
	static PyMethodDef _ClientObjectBase_scriptMethods[]; 
	static PyMemberDef _ClientObjectBase_scriptMembers[]; 
	static PyGetSetDef _ClientObjectBase_scriptGetSeters[]; 
	static bool _ClientObjectBase_py_installed; 

	static int __py_readonly_descr(PyObject* self, PyObject* value, void* closure) { 
	    PyErr_Format(PyExc_TypeError, "Sorry, this attribute %s.%s is read-only", 
	    (self != 0 ? self->ob_type->tp_name : "ClientObjectBase"), 
	    (closure != 0 ? (char*)closure : "unknown")); 
        PyErr_PrintEx(0); 
        return 0; }
 
	static int __py_writeonly_descr(PyObject* self, PyObject* value, void* closure) { 
	    PyErr_Format(PyExc_TypeError, "Sorry, this attribute %s.%s is write-only", 
	    (self != 0 ? self->ob_type->tp_name : "ClientObjectBase"), 
	    (closure != 0 ? (char*)(closure) : "unknown")); 
        PyErr_PrintEx(0); 
        return 0; }
 
	static PyTypeObject* getScriptType(void) { return &_scriptType; } 

	static PyTypeObject* getBaseScriptType(void) { 
	    if(strcmp("ScriptObject", "ScriptObject") == 0) 
            return 0; 
	    return ScriptObject::getScriptType(); } 
	
    static long calcDictOffset(void) { 
	    if(strcmp("ScriptObject", "ScriptObject") == 0) 
	        return 0; 
	    return 0; }
 
	static int calcTotalMethodCount(void) { 
	    int nlen = 0; 
	    while(true) { 
	        PyMethodDef* pmf = &_ClientObjectBase_scriptMethods[nlen]; 
	        if(!pmf->ml_doc && !pmf->ml_flags && !pmf->ml_meth && !pmf->ml_name) 
                break; 
	        nlen++; 
        } 
        
        if(strcmp("ClientObjectBase", "ScriptObject") == 0) 
	        return nlen; 
        return ScriptObject::calcTotalMethodCount() + nlen; 
    }
 
	static int calcTotalMemberCount(void) { 
        int nlen = 0; 
        while(true) { 
	        PyMemberDef* pmd = &_ClientObjectBase_scriptMembers[nlen]; 
	        if(!pmd->doc && !pmd->flags && !pmd->type && !pmd->name && !pmd->offset) 
	            break; 
            nlen++; 
        } 
        if(strcmp("ClientObjectBase", "ScriptObject") == 0) 
	        return nlen; 
        return ScriptObject::calcTotalMemberCount() + nlen; 
    } 

	static int calcTotalGetSetCount(void) { 
        int nlen = 0; 
        while(true) { 
            PyGetSetDef* pgs = &_ClientObjectBase_scriptGetSeters[nlen]; 
	        if(!pgs->doc && !pgs->get && !pgs->set && !pgs->name && !pgs->closure) 
                break; 
            nlen++; 
        } 
	if(strcmp("ClientObjectBase", "ScriptObject") == 0)
	    return nlen; 
    return ScriptObject::calcTotalGetSetCount() + nlen; 
} 
	

static void setupScriptMethodAndAttribute(
    PyMethodDef* lppmf, PyMemberDef* lppmd, PyGetSetDef* lppgs) { 
    int i = 0; 
    PyMethodDef* pmf = 0; 
    PyMemberDef* pmd = 0; 
    PyGetSetDef* pgs = 0; 
    while(true){ 
        pmf = &_ClientObjectBase_scriptMethods[i]; 
        if(!pmf->ml_doc && !pmf->ml_flags && !pmf->ml_meth && !pmf->ml_name) 
            break; 
		i++; 
        *(lppmf++) = *pmf; 
    } 
    i = 0; 
    while(true){ 
        pmd = &_ClientObjectBase_scriptMembers[i]; 
        if(!pmd->doc && !pmd->flags && !pmd->type && !pmd->name && !pmd->offset) 
            break; 
        i++; 
        *(lppmd++) = *pmd; 
    } 
    i = 0; 
    while(true){ 
        pgs = &_ClientObjectBase_scriptGetSeters[i]; 
        if(!pgs->doc && !pgs->get && !pgs->set && !pgs->name && !pgs->closure) 
			break;
        i++; 
        *(lppgs++) = *pgs; 
    } 
    if(strcmp("ClientObjectBase", "ScriptObject") == 0){ 
        *(lppmf) = *pmf; 
        *(lppmd) = *pmd; 
        *(lppgs) = *pgs; 
        return; 
    } 

    ScriptObject::setupScriptMethodAndAttribute(lppmf, lppmd, lppgs); 
} 

static void registerScript(PyObject* mod, const char* name = "ClientObjectBase") { 
    int nMethodCount = ClientObjectBase::calcTotalMethodCount(); 
    int nMemberCount = ClientObjectBase::calcTotalMemberCount(); 
    int nGetSetCount = ClientObjectBase::calcTotalGetSetCount();                           
    _ClientObjectBase_lpScriptmethods = new PyMethodDef[nMethodCount + 2]; 
    _ClientObjectBase_lpScriptmembers = new PyMemberDef[nMemberCount + 2]; 
    _ClientObjectBase_lpgetseters = new PyGetSetDef[nGetSetCount + 2];             
    setupScriptMethodAndAttribute(_ClientObjectBase_lpScriptmethods, 
    _ClientObjectBase_lpScriptmembers, _ClientObjectBase_lpgetseters); 
    _scriptType.tp_methods = _ClientObjectBase_lpScriptmethods; 
    _scriptType.tp_members = _ClientObjectBase_lpScriptmembers; 
    _scriptType.tp_getset = _ClientObjectBase_lpgetseters; 
    if (PyType_Ready(&_scriptType) < 0){ 
        DebugHelper::getSingleton().error_msg(("registerScript(): PyType_Ready(" 
        "ClientObjectBase" ") error!")); 
        PyErr_Print(); 
        return; 
    } 
    if(mod) { 
        ( _Py_RefTotal++ , ((PyObject *)(&_scriptType))->ob_refcnt++); 
        if(PyModule_AddObject(mod, name, (PyObject *)&_scriptType) < 0) { 
          DebugHelper::getSingleton().error_msg((fmt::format("registerScript(): 
          PyModule_AddObject({}) error!", name))); 
        } 
     } 
     { if (PyErr_Occurred()) { PyErr_PrintEx(0); } }; 
   _ClientObjectBase_py_installed = true; 
} 

static void installScript(PyObject* mod, const char* name = "ClientObjectBase") {         
    ClientObjectBase::onInstallScript(mod); 
    registerScript(mod, name); 
    ScriptObject::scriptObjectTypes[name] = &_scriptType; 
 } 

static void unregisterScript(void) { 
  if (_ClientObjectBase_lpScriptmethods) { 
   delete[] _ClientObjectBase_lpScriptmethods; 
   _ClientObjectBase_lpScriptmethods = 0; 
  }; 

  if (_ClientObjectBase_lpScriptmembers) { 
    delete[] _ClientObjectBase_lpScriptmembers; 
    _ClientObjectBase_lpScriptmembers = 0; 
  }; 

  if (_ClientObjectBase_lpgetseters) { 
     delete[] _ClientObjectBase_lpgetseters; 
     _ClientObjectBase_lpgetseters = 0; 
   }; 

   if(_ClientObjectBase_py_installed) 
      do { 
       PyObject *_py_decref_tmp = (PyObject *)(&_scriptType); 
       if (_Py_RefTotal-- , --(_py_decref_tmp)->ob_refcnt != 0) { 
         if (((PyObject*)_py_decref_tmp)->ob_refcnt < 0) 
            _Py_NegativeRefcount(
			"e:\\kbe\\kbengine-1.3.6\\kbe\\src\\lib\\client_lib\\clientobjectbase.h", 
			56, (PyObject *)(_py_decref_tmp)); 
		} 
		else 
			_Py_Dealloc(_py_decref_tmp); 
		} while (0); 
} 


static void uninstallScript(void) { 
   ClientObjectBase::onUninstallScript(); 
   unregisterScript(); 
}; 


static void _tp_dealloc(PyObject* self) { 
  delete static_cast<ClientObjectBase*>(self);
}	  

 

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值