Python内置函数delattr的具体用法
delattr函数用于删除属性。
delattr(x,'foobar')相等于delx.foobar。
语法
setattr语法:delattr(object,name)
参数
- object--对象。
- name--必须是对象的属性。
英文文档:
delattr(object,name)
Thisisarelativeofsetattr().Theargumentsareanobjectandastring.Thestringmustbethenameofoneoftheobject'sattributes.Thefunctiondeletesthenamedattribute,providedtheobjectallowsit.Forexample,delattr(x,'foobar')isequivalenttodelx.foobar.说明:
定义类
#coding=utf-8 #class_my.py定义类(新式类) #定义类 classPerson: #类属性(class)(注:类/类方法能修改类属性;对象不能修改类属性,更改的只是实例属性) name="name"#公共属性 __adress="adress"#私有属性(__属性表示私有) #构造方法(对象创建调用)(__init__表示构造) def__init__(self,name,address="地球"): #实例属性 self.name=name#(注:类属性与实例属性名称相同时用实例属性,实例属性被删除后使用类属性) self.__adress=address Person.setData(self) #析构方法(对象销毁调用)(__del__表示析构) def__del__(self): print("对象被销毁.") #toString() def__str__(self): return"Person.class" #实例方法(this) defsetName(self,name):#self可为其他字符串(this) self.name=name;#修改实例属性(不存在自动添加) #类方法(static) @classmethod defsetName_cls(cls,name): cls.name=name#修改类属性 #静态方法(tools) @staticmethod defsetName_sta(name):#(注:参数部分) returnname defgetName(self): returnself.name defsetData(self): #实例属性 self.__age=21#私有属性 self.sex="女"#公共属性 defshow(self): print("Hello!%s"%self.name) print("Address:%s"%self.__adress)#使用自身私有属性 self.__eat()#使用自身私有方法 def__eat(self):#私有方法 print("eat") #=======函数调用====== if__name__=="__main__": #-创建对象- ps=Person("LY") #---调用方法--- #调用实例方法 ps.setName("LY")#实例调用实例方法 ps.show() #调用类方法 Person.setName_cls("Person")#类调用类方法 ps.setName_cls("Person")#实例调用类方法 #调用静态方法() print(ps.setName_sta("Per"))#实例调用静态方法 print(Person.setName_sta("Per"))#类调用静态方法 #---访问属性--- print(ps.getName()) print(ps.name)#访问类属性的公共属性值 print(ps.sex)#访问实例属性的公共属性值 #---修改属性--- #修改实例属性 ps.name="123"#修改类属性(注:并非真修改,只是向对象中创建了一个实例属性) delps.name#删除实例属性(注:实例不能(非类方法)删除类属性,只是删除了对象中创建的实例属性,类属性依然存在) delps.sex#删除实例属性(注:真删除,删除后不能访问) #修改类属性 Person.name="Person"#修改类属性 Person.setName_cls("Person")#类调用类方法修改类属性(注:类不能调用实例方法) ps.setName_cls("Person")#对象通过类方法修改类属性 delPerson.name#删除类属性 #-删除对象- delps #>Lessismore!"静态方法"和"类方法/属性"同级都可理解为"静态",静态方法适合做工具箱,类方法/属性可认为在静态区,随手拿来即用,而实例则需要实例化才能使用.(--本人的个人理解) #=======函数调用======
继承
#coding=utf-8 #class_extend.py继承(新式类) #---单继承--- #父类 classAnimal(object): def__init__(self,name="动物"): self.name=name defrun(self): print("%s在跑."%self.name) #子类 classCat(Animal):#继承(父类写()内) def__init__(self,name,ot=""): super(Cat,self).__init__(name) defmiao(self): print("喵") #---多继承--- classDonkey:#驴 defwalk(self): print("walk") defeat(self): print("Donkey.eat") classHorse:#马 defrun(self): print("run") defeat(self): print("Horse.eat") classMule(Donkey,Horse):#骡(驴+马) pass #===多态==== defanimalRun(animal):#参数接收自己及其自己的子类 animal.run() #=======函数调用====== if__name__=="__main__": #-单继承调用- ani=Animal() ani.run() cat=Cat("猫") cat.run() cat.miao() #-多继承调用- mule=Mule() mule.walk() mule.run() mule.eat()#多个父类中有相同的方法时,调用()内最前面的父类(Donkey)的方法 #-多态调用- ani=Animal() animalRun(ani) cat=Cat("猫") animalRun(cat) #=======函数调用======
重写
#coding=utf-8 #class_rewrite.py重写(新式类) classAnimal(object): defrun(self): print("Animal.run") defeat(self,food="食物"): print("eat:%s"%food) classCat(Animal): #子类重写了父类的方法 defrun(self): print("Cat.run") defeat(self): #调用父类的方法 super(Cat,self).eat("猫粮") #=======函数调用====== if__name__=="__main__": ani=Animal() ani.run() ani.eat() cat=Cat() cat.run() cat.eat() #=======函数调用======
属性方法
#!/usr/bin/envpython #coding=utf-8 __author__='Luzhuo' __date__='2017/5/13' #class_propertiemethod.py属性方法 #属性方法:把方法变成静态属性 #写法1 classPM_1(object): def__init__(self): self.__name_str="PropertieMethod_1" #获取 @property defname(self):#注意,方法名相同 returnself.__name_str #设置 @name.setter defname(self,name): self.__name_str=name #删除 @name.deleter defname(self): delself.__name_str if__name__=="__main__": pm=PM_1() print(pm.name) pm.name="PM" print(pm.name) delpm.name #print(pm.name) #========================================================== #写法2 classPM_2(object): def__init__(self): self.__name_str="PropertieMethod_2" #获取 defgetname(self): returnself.__name_str #设置 defsetname(self,name): self.__name_str=name #删除 defdelname(self): delself.__name_str #property(fget=None,fset=None,fdel=None,doc=None)#返回一个property属性,实现原理见内置函数文章property_my块代码(http://blog.csdn.net/rozol/article/details/70603230) name=property(getname,setname,delname) if__name__=="__main__": p=PM_2() print(p.name) p.name="PM2" print(p.name) delp.name #print(p.name)
反射
#!/usr/bin/envpython #coding=utf-8 __author__='Luzhuo' __date__='2017/5/13' #class_reflection.py反射 #通过反射机制,可动态修改程序运行时的状态/属性/方法 #Python的反射机制性能如何?在Android中Java的反射产生垃圾而执行gc,从而导致UI不流畅,而且性能低 #Python的反射性能(1亿次测试):直接获取属性值:反射获取属性值=1:1.164;直接设置属性值:反射设置属性值=1:1.754 defsetname(self,name): self.name=name classClazz(object): def__init__(self): self.name="Clazz" defgetname(self): returnself.name if__name__=="__main__": c=Clazz() #---方法--- ifhasattr(c,"getname"): #获取 method=getattr(c,"getname",None) ifmethod: print("setname_ref:{}".format(method()))#获取方法对象并执行 ifnothasattr(c,"setname"): #添加 setattr(c,"setname",setname)#添加方法 method=getattr(c,"setname",None) ifmethod: method(c,"Reflection") print("setname_raw:{}".format(c.getname())) ifhasattr(c,"setname"): #删除 delattr(c,"setname") #c.setname(c,"Demo") #---属性--- ifnothasattr(c,"age"): #添加 setattr(c,"age",21)#添加方法 var=getattr(c,"age",None) print("age_ref:{}".format(var)) print("age_raw:{}".format(c.age)) ifhasattr(c,"age"): #获取 var=getattr(c,"age",None) print("age_ref:{}".format(var)) ifhasattr(c,"age"): #删除 delattr(c,"age") #print("age_raw:{}".format(c.age))
文档注释
#!/usr/bin/envpython #coding=utf-8 __author__='Luzhuo' __date__='2017/5/13' #class_doc.py文档注释 #文档注释的编写 classFoo(object): ''' 这是一个类 ''' defmethod(self,data): ''' 这是一个方法 :paramdata:需要的数据 :return:返回的数据 ''' return"method" deffunc(data): ''' 这是一个函数 :paramdata:需要的数据 :return:返回的数据 ''' return"func" if__name__=="__main__": #打印文档 print(Foo.__doc__) print(Foo().method.__doc__) print(func.__doc__)
创建类的原理
#!/usr/bin/envpython #coding=utf-8 __author__='Luzhuo' __date__='2017/5/13' #class_origin.py类的由来 #类由type类实例化产生,而type由解释器产生 age=21 def__init__(self): self.name="origin" defgetname(self): returnself.name defsetname(self,name): self.name=name defdelname(self): delself.name if__name__=="__main__": #用type创建类(类名,基类元组,类成员字典) Foo=type('Foo',(object,),{'__init__':__init__,"getname":getname,"setname":setname, "delname":delname,"age":age}) #实例化类 f=Foo() #使用 print(f.age) print(f.getname()) f.setname("ClassOrigin") print(f.getname()) f.delname() #print(f.getname()) #================================================================================== #元类(type创建类原理) #元类是用于创建所有类的类,Python中是type类(注意,类也是对象,也是被创建出来的,即万物皆对象),下面将演示type类的功能 #__call__的调用(__new__在__init__之前调用,__call__在什么时候调用呢) classFoobar(object): def__call__(self,*args,**kwargs): print("Foobar__call__") if__name__=="__main__": fb=Foobar() fb()#只有在这个时候才会调用__call__属性 Foobar()()#等同于该方式 #------ #metaclass指定类有谁来创建 #Python创建类时会寻找__metaclass__属性,(包括父类)没有找到将使用内建元类type classMyType(type): def__init__(self,*args,**kwargs): print("MyType__init__") def__call__(self,*args,**kwargs): print("MyType__call__") obj=self.__new__(self) self.__init__(obj,*args,**kwargs) returnobj def__new__(cls,*args,**kwargs): print("MyType__new__") returntype.__new__(cls,*args,**kwargs) classFoo(object,metaclass=MyType):#(Python3.x写法)metaclass用于创建类,Python创建类时会寻找__metaclass__属性,(包括父类)没有找到将使用内建元类type #__metaclass__=MyType#Python2.x写法 def__init__(self): print("Foo__init__") def__new__(cls,*args,**kwargs):#用于实例化对象 print("Foo__new__") returnobject.__new__(cls)#必须是返回 defshow(self): print("Fooshow") if__name__=="__main__": print("start") f=Foo() f.show() #MyType__new__=>MyType__init__=>'start'=>MyType__call__=>Foo__new__=>Foo__init__=>'Fooshow'
其他的一些补充
#!/usr/bin/envpython #coding=utf-8 __author__='Luzhuo' __date__='2017/5/13' #class_other.py关于类的一些补充 classDemo(object): defshow(self): print("Demoshow") if__name__=="__main__": #__module__该对象的模块名 #__class__该对象的类对象 print(Demo.__module__)#该对象的模块名=>__main__ print(Demo.__class__)#该对象的类对象=>obj=Demo() print(obj.__module__)#该对象的模块名=>__main__ print(obj.__class__)#该对象的类对象=> obj.__class__.show(obj)#类对象可被使用 #============================ #__dict__类或对象中的所有成员 print(Demo.__dict__)#类属性 print(obj.__dict__)#实例属性
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。