当前位置: 首页 > 后端技术 > Python

PythonOOP-4

时间:2023-03-26 17:07:17 Python

8.类成员描述符(属性)类成员描述符是在类中创建类成员属性相关操作的方法get:获取属性的操作set:修改或添加属性操作delete:删除属性如果要使用成员类的描述符,使用类实现描述符大概有3种方式,使用属性修饰符,使用属性函数,属性函数很简单property(fget,fset,fdel,doc)不管是哪种修饰符for成员属性对应的控制类方法:适用于多个类中的多个属性共享同一个描述符property:适用于当前类中使用,可以控制一个类中的多个属性属性修饰符:适用于当前类中用于控制一个属性在一个类中9.类的内置属性__dict__:以字典的形式显示类的成员组成__doc__:Get类的文档信息__name__:获取类的名称,如果在模块中使用,则获取模块的名称__bases__:获取一个类的所有父类,并以元组的形式显示特征,方法名被包裹Operationclass__init__:constructor__new__:objectinstantiationmethod前后有两个下划线,这个魔术方法比较特殊,一般不需要使用__call__:objectistriggeredwhenthefunctionuse__str__:whentheobjectisusedasastring__repr__:返回字符串描述符相关__set____get____delete__属性操作相关__getattr__:访问不存在的属性时触发__setattr__:设置成员属性时触发参数:self获取当前对象设置的属性名,需要设置的值对于属性名以字符串的形式出现作用:设置属性时校验或修改属性注:该方法中,属性可以不赋值,否则死循环操作类相关魔术方法__gt__:大于判断时触发的函数参数self第二个参数为第二个对象返回值可以是任意值,建议返回布尔值value11.类和对象的三种方法实例方法要求实例方法只有在对象被转化时才能使用。在使用过程中,可能需要完成该对象的其他对象的方法。静态方法不需要实例化,通过类直接访问类方法也不需要实例化。具有Student.name属性#但名称格式不是uniform#可以添加一个函数然后自动调用,但是很笨classStudent():def__init__(self,name,age):self.name=nameself.age=age#如果不想修改代码self.setName(name)#自我介绍defintro(self):print("Hai,mynameis{0}".format(self.name))defsetName(self,name):self.name=name...propertyacase#definition一个带有name和age属性的Person类#对于任何输入的名字,我们希望将其保存为大写#Age,我们希望在内部将其保存为一个整数#x=property(fget,fset,fdel,doc)classPerson():'''这是一个人,一个高尚的人,一个低俗的人,他还有他妈的属性'''#函数名可以任意deffget(self):returnself._name*2deffset(self,name):#所有输入的名字都以大写形式保存self.name=name.upper()deffdel(self):self._name="NoName"name=property(fget,fset,fdel,"AddnametonameOperation")#类的内置属性示例print(Person.__dict__)print(Person.__doc__)print(Person.__name__)#元组形式显示所有父类print(Person.__bases__){'__module__':'__main__','__doc__':'\n这是一个人,一个高贵的Man,一个脱俗的人\n他还有他妈的属性\n','fget':,'fset':,'fdel':,'name':,'__dict__':,'__weakref__':}This是人,高尚的人,脱俗的人,他妈的还有属性Person(,)#initexampleclassA():def__init__(self,name=0):print("Haha,Iwascalled")a=A()Haha,Iwascalled#__call__示例类A():def__init__(self,name=0):print("Haha,Iwascalled")def__call__(self):print("Iwascalledagain")a=A()a()哈哈,我被叫了Iwascalledagain#__str__ExampleclassA():def__init__(self,name=0):print("哈哈,我被调用了")def__call__(self):print("我又被调用了")def__str__(self):return'666'a=A()print(a)哈哈,我被调用了666#__getattr__classA():name="NoName"age=18def__getattr__(self,name):print("notfound")print(name)a=A()print(a.name)print(a.addr)NoNamenotfoundaddrNone#__setattr__caseclassPerson():def__init__(self):passdef__setattr__(self,name,value):print("Setattribute:{0}".format(name))#下面的语句会出问题,无限循环#self.name=value#这种情况下,为了避免死循环,规定统一调用父类魔术函数super().__setattr__(name,value)p=Person()print(p.__dict__)p.age=18{}设置属性:age#__gt__classStudent():def__init__(self,name):self._name=namedef__gt__(self,obj):print("哈哈,{0}会比{1}大吗?".format(self,obj))returnself._name>obj._namestu1=Student("one")stu2=Student("two")print(stu1>stu2)哈哈,<__main__.Studentobjectat0x000001C15772EB38>会比<__main__.Studentobjectat0x000001C15772E550>大吗?False#三个方法的情况classPerson():#实例方法defeat(self):print(self)print("Eating...")#类方法#类方法的第一个参数,一般命名为cls,不同于self@classmethoddefplay(cls):print(cls)print("Playing...")#静态方法#不需要用第一个参数代表自己或类@staticmethoddefsay():print("Saying...")yueyue=Person()#实例方法yueyue.eat()#类方法Person.play()yueyue.play()#静态方法Person.say()yueyue.say()<__main__.Personobjectat0x000001C157766710>Eating...Playing...Playing...Saying...Saying...