day⑦:类的3大成员
start
py3
类的三大成员: 字段(变量) 、属性、方法
一.字段(实例变量和类变量)
例子:
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 | #!/usr/bin/env python#coding=utf-8 class Province: ''' 字段(变量)包括:普通字段(实例变量)和静态字段(类变量),他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段(实例变量)属于对象 静态字段(类变量)属于类 ''' #静态字段(类变量) country="中国" def __init__(self,name): #普通字段(实例变量) self.name=name #直接访问普通字段(实例变量)obj=Province("广州")print(obj.name) obj.name="你妹"obj.name2="你妹2"obj.yaobin="自己定义实例变量" print(obj.name)print(obj.name2)print(obj.yaobin) #直接访问静态字段(类变量)print(Province.country) ##结果:广州你妹你妹2自己定义实例变量中国 |
二.属性
①装饰器方式定义属性之新式类
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 | #!/usr/bin/env python#coding=utf-8 '''装饰器方式:在类的普通方法上应用@property装饰器''' #新式类class animal(object): ''' 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法 ''' def __init__(self, name): self.name = name self.num = None @property def price(self): return self.num @price.setter def price(self,num): self.num=num print("设置num",self.num) @price.deleter def price(self): print("删除",self.num) del self.num dog=animal("随便") #实例化 ################################################################################ print(dog.price) # 自动执行 @property 修饰的 price 方法,并获取方法的返回值 #输出是None dog.price="123456" # 自动执行 @price.setter 修饰的 price 方法,并将 123456 赋值给方法的参数print(dog.price) #现在是123456了 del dog.price # 自动执行 @price.deleter 修饰的 price 方法#print(dog.price) #再打印,是会报错的 ##结果:None设置num 123456123456删除 123456 |
②装饰器方式定义属性之经典类
| 1234567891011121314151617181920212223242526 | #!/usr/bin/env python#coding=utf-8 '''装饰器方式:在类的普通方法上应用@property装饰器''' #经典类class Goods: ''' 经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法 ''' @property def price(self): return "yaobin" obj=Goods()result=obj.price #自动执行 @property 修饰的 price 方法,并获取方法的返回值 print(result) #结果:yaobin |
③静态字段(类变量)方式定义属性
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | #!/usr/bin/env python#coding=utf-8 '''创建值为property对象的静态字段(类变量)''' class Foo(object): ''' 当使用静态字段(类变量)的方式创建属性时,经典类和新式类无区别 ''' def __init__(self,name): self.name = name self.num = None def get_bar(self): return self.num #必须两个参数 def set_bar(self,num): self.num=num print("设置num",self.num) def del_bar(self): print("我要删了num",self.num) del self.num BAR=property(get_bar,set_bar,del_bar,'描述信息') obj=Foo("haha") #实例化 #############调用################## # 自动调用第一个参数中定义的方法:get_barprint(obj.BAR) # 自动调用第二个参数中定义的方法:set_bar方法,并将123456当作参数传入obj.BAR=123456print(obj.BAR) # 自动调用第三个参数中定义的方法:del_bar方法del obj.BAR#print(obj.BAR) #再打印,报错! ##结果:None设置num 123456123456我要删了num 123456 |
三.方法
1.普通方法、2.类方法、3.静态方法
例子:
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | #!/usr/bin/env python#coding=utf-8 class Foo: ''' 方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self; 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls; 静态方法:由类调用;无默认参数; ''' test="gril" #类变量 def __init__(self,name): self.name=name def ord_func(self): """ 定义普通方法,至少有一个self参数 """ print("普通方法%s"%(self.name)) @classmethod def class_func(cls): """ 定义类方法,至少有一个cls参数 """ #print("类方法 %s",self.name) #不能访问普通字段(实例变量) print("类方法",Foo.test) #可以访问静态字段(类变量) @staticmethod def static_func(): """ 定义静态方法 ,无默认参数""" print("静态方法") #不能访问类变量(静态字段),也不能访问实例变量(普通字段),和类就一个组织逻辑关系,没什么用 #实例化obj=Foo("yaobin") #调用普通方法obj.ord_func() #调用类方法Foo.class_func() #调用静态方法Foo.static_func() ##结果:普通方法yaobin类方法 gril静态方法 |
end
来自为知笔记(Wiz)