论 静态方法@staticmethod 类方法@classmethod @property属性

1. 类属性、实例属性

class Province(object):
    # 类属性
    country = '中国'
    def __init__(self, name):
        # 实例属性
        self.name = name
# 创建一个实例对象
obj = Province('山东省')
# 直接访问实例属性
print(obj.name)
# 直接访问类属性
Province.country

由上述代码可以看出【实例属性需要通过对象来访问】【类属性通过类访问】,在使用上可以看出实例属性和类属性的归属是不同的。

其在内容的存储方式类似如下图:

2. 实例方法、静态方法和类方法

方法包括:实例方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

  • 实例方法:由对象调用;至少一个self参数;执行实例方法时,自动将调用该方法的对象赋值给self;
  • 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类赋值给cls;
  • 静态方法:由类调用;无默认参数;
    class Foo(object):
        def __init__(self, name):
            self.name = name
        def ord_func(self):
            """ 定义实例方法,至少有一个self参数 """
            # print(self.name)
            print('实例方法')
        @classmethod
        def class_func(cls):
            """ 定义类方法,至少有一个cls参数 """
            print('类方法')
        @staticmethod
        def static_func():
            """ 定义静态方法 ,无默认参数"""
            print('静态方法')
    f = Foo("中国")
    # 调用实例方法
    f.ord_func()
    # 调用类方法
    Foo.class_func()
    # 调用静态方法
    Foo.static_func()

    对比

    • 相同点:对于所有的方法而言,均属于类,所以 在内存中也只保存一份
    • 不同点:方法调用者不同、调用方法时自动传入的参数不同。
    • 1. 什么是property属性

      一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法

      class Foo:
          def func(self):
              pass
          # 定义property属性
          @property
          def prop(self):
              pass
      # ############### 调用 ###############
      foo_obj = Foo()
      foo_obj.func()  # 调用实例方法
      foo_obj.prop  # 调用property属性

       

      property属性的定义和调用要注意一下几点:
      • 定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
      • 调用时,无需括号
      • 经典类,具有一种@property装饰器

        # ############### 定义 ###############    
        class Goods:
            @property
            def price(self):
                return "laowang"
        # ############### 调用 ###############
        obj = Goods()
        result = obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
        print(result)

        新式类,具有三种@property装饰器

        #coding=utf-8
        # ############### 定义 ###############
        class Goods:
            """python3中默认继承object类
                以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter  @xxx.deleter
            """
            @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.deleter
            def price(self):
                del self.original_price
        
        obj = Goods()
        obj.price         # 获取商品价格
        obj.price = 200   # 修改商品原价
        del obj.price     # 删除商品原价
原文地址:https://www.cnblogs.com/huazhou695/p/9896032.html