""" Demo a DynamicPolicy használatára Attrs példányainak nincs metódusa, de tetszőleges számú tulajdonsága lehet, melyek futásidőben egyszerű értékadással keletkeznek. Természetesen hiba generálódik, ha olyan tulajdonságra hivatkozunk akinek még nem lett érték adva. Futás közben egy már létező tulajdonság tipusa megváltoztatható, egyszerűen egy más tipusú értéket pakolunk bele(ez nem ügy hiszen a Python így működik). """ import pythoncom import winerror from win32com.server.exception import COMException import string class Attrs: """ Demo a DynamicPolicy használatára """ # szokásos regisztrációs adatok _reg_desc_ = 'Attrs demo class' _reg_clsid_ = '{CFFDFAAB-AD71-48B1-A478-695B44617AA0}' _reg_progid_ = 'Demo.Attrs' _reg_verprogid_ = 'Demo.Attrs.1' _reg_policy_spec_ = 'DynamicPolicy' # kigyűjtöttem ide azokat a regisztrációhoz és működéshez használatos elmeket, # akiket nem akarunk elérhetővé tenni a COM-os felületen keresztül _tiltott_nevek_ = ['_reg_desc_', '_reg_clsid_', '_reg_progid_', '_reg_verprogid_', '_reg_policy_spec_', '_tiltott_nevek_', '_dynamic_'] def _dynamic_(self, name, lcid, wFlags, args): name=string.lower(name) # mindent kisbetűre konvertálok, hogy ne legyen kavar if name in self._tiltott_nevek_: raise COMException("%s használata tiltott!" % name,winerror.DISP_E_EXCEPTION) if wFlags & pythoncom.DISPATCH_METHOD: raise COMException("A metódushívás tiltott!",winerror.DISP_E_EXCEPTION) elif wFlags & pythoncom.DISPATCH_PROPERTYGET: # figyelni kell, mert lehet még nincs ilyen tulajdonság try: return getattr(self,name) except AttributeError: # DISP_E_MEMBERNOTFOUND nem jó, mert a Python kliens erre azt hiszi, hogy metódusról # van szó. A Python számára a metódus is csak egy attributum, ezért először # DISPATCH_PROPERTYGET-el próbálkozik és ha DISP_E_MEMBERNOTFOUND-ot kap vissza, akkor # metódusnak hiszi raise COMException("Nincs %s nevű tulajdonság!" % name,winerror.DISP_E_UNKNOWNNAME) elif wFlags & (pythoncom.DISPATCH_PROPERTYPUT | pythoncom.DISPATCH_PROPERTYPUTREF): # itt nem lehet hiba setattr(self,name,args[0]) return else: raise COMException("invalid wFlags", winerror.E_INVALIDARG) def Register(): # szokásos regisztrálás, de a policy nem az alapértelmezett DesignatedWrapPolicy lesz, # hanem a H2O class _reg_policy_spec_ attributumában beállított DynamicPolicy from win32com.server.register import UseCommandLine return UseCommandLine(Attrs) if __name__=='__main__': Register()