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)