zoukankan      html  css  js  c++  java
  • python面向对象(二)——类成员

     Python面向对象    类成员

     

     

     

    1、字段

            普通字段    属于对象
            静态字段    属于类
     

    2、方法

    • 普通方法  
      • 触发者是对象    括号里至少一个参数 self = 当前对象 可以有多个参数
    • 类方法    
      • @classmethod   (cls=当前类)  触发者是类,用类直接调用,括号里只能有一个参数cls
                            对静态方法的约束,只能有一个参数,参数在传值的时候自动把当前类传入。单例模式时用到。
    • 静态方法  
      • 属于类   @staticmethod   触发者类,括号里不需要参数(),也可以有多个参数
                    类加上静态方法=一个函数 。创建对象就可以访问方法,就像创建了函数。如果程序全部要求用面向对象做,而不用函数,静态方法才有用。
     
    为什么要有类方法和静态方法?
             因为如果没有这两种方法,在调用时就会先创建对象在去调用方法。而这两种方法都可以直接通过类来调用,节省的内存。
                               
    class foo():
        def func(self):
            print "This is common method"
    
        @classmethod                    #类方法
        def class_func(cls):                #参数为cls  
            print "This is class method!!!"
    
        @staticmethod              #静态方法
        def static_method():
            print "This is static method!!"
    
    obj = foo()
    obj.func()    #用对象直接调用普通方法
    foo.class_func()    #通过类来直接调用类方法
    foo.static_method()   #通过类来直接调用静态方法
    

      

    3、属性

    属性把一个方法伪造成一个字段、一个属性,像字段那样的属性而不是一个功能

    • 定义时,在普通方法的基础上添加 @property 装饰器;
    • 定义时,属性仅有一个self参数
    • 调用时,无需括号
                 普通方法:foo_obj.func()
                 属性方法:foo_obj.prop

    属性的两种定义方式

    • 装饰器  即:在方法上应用装饰器
    • 静态字段  即:在类中定义值为property对象的静态字段

      装饰器方式在类的普通方法上应用@property装饰器

      • 经典类,具有一种@property装饰器(如上一步实例)
    # ############### 定义 ###############            
            class Goods:
                @property
                def price(self):
                    return"wupeiqi"        
    # ############### 调用 ###############
            obj = Goods()
            result = obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
    
      • 新式类,具有三种@property装饰器
    # ############### 定义 ###############        
        class Goods(object):
              @property
              def price(self):
                   print'@property'
    
              @price.setter
              def price(self, value):
                   print'@price.setter'
    
              @price.deleter
                def price(self):
                   print'@price.deleter'    
    # ############### 调用 ###############
            obj = Goods()
    
            obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
            obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数              del obj.price      # 自动执行 @price.deleter 修饰的 price 方法
    

        由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

    class Goods(object):
    
        def__init__(self):
            # 原价
            self.original_price = 100
            # 折扣
            self.discount = 0.8
    
        @property
        def price(self):
            # 实际价格 = 原价 * 折扣
            new_price = self.original_price * self.discount
            return new_price
    
        @price.setter
        def price(self, value):
            self.original_price = value
    
        @price.deltter
        def price(self, value):
            del self.original_price
    
    obj = Goods()
    obj.price         # 获取商品价格
    obj.price = 200   # 修改商品原价
    del obj.price     # 删除商品原价
     
      静态字段方式创建值为property对象的静态字段
        当使用静态字段的方式创建属性时,经典类和新式类无区别
    class Foo:
    
        def get_bar(self):
            return 'wupeiqi'
    
        BAR = property(get_bar)
    
    obj = Foo()
    reuslt = obj.BAR        # 自动调用get_bar方法,并获取方法的返回值
    print reuslt
    

     

     

      property的构造方法中有个四个参数
     
    • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
    • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
    • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
    • 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息

     

    class Foo:
    
        def get_bar(self):
            return'wupeiqi'
        # *必须两个参数
        def set_bar(self, value): 
            return 'set value' + value
    
        def del_bar(self):
            return'wupeiqi'
    
        BAR = property(get_bar, set_bar, del_bar, 'description...')
    
    obj = Foo()
    
    obj.BAR              # 自动调用第一个参数中定义的方法:get_bar
    obj.BAR = "alex"     # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
    del Foo.BAR          # 自动调用第三个参数中定义的方法:del_bar方法
    obj.BAE.__doc__      # 自动获取第四个参数中设置的值:description...
    

      由于静态字段方式创建属性具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

    class Goods(object):
    
        def__init__(self):
            # 原价
            self.original_price = 100
            # 折扣
            self.discount = 0.8
    
        def get_price(self):
            # 实际价格 = 原价 * 折扣
            new_price = self.original_price * self.discount
            return new_price
    
        def set_price(self, value):
            self.original_price = value
    
        def del_price(self, value):
            del self.original_price
    
        PRICE = property(get_price, set_price, del_price, '价格属性描述...')
    
    obj = Goods()
    obj.PRICE         # 获取商品价格
    obj.PRICE = 200   # 修改商品原价
    del obj.PRICE     # 删除商品原价
    

      

     

  • 相关阅读:
    BZOJ 1103 Poi2007 大都市meg
    BZOJ 2815 ZJOI2012 灾难
    【bzoj】1046: [HAOI2007]上升序列
    P1168跳房子(焫鷄如我)
    HAIO2017[打酱油的旅行!?]
    [haoi2013]花卉节
    P1298(矩阵切割)DP
    P1216 (list加强版)
    p1219最佳贸易(两边bfs写的)
    p1150[noip2013普及]表达式求值
  • 原文地址:https://www.cnblogs.com/chenchao1990/p/5377599.html
Copyright © 2011-2022 走看看