• 论 静态方法@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     # 删除商品原价
  • 相关阅读:
    mangodb学习0.1 概念
    express 学习笔记(一)路由
    vue配置路由
    screenX, clientX, pageX
    svg的世界、视窗、视野
    window.print()打印网页(一)
    cookie基础
    BOM基础
    Java三大特征:封装 继承 多态
    面向对象
  • 原文地址:https://www.cnblogs.com/huazhou695/p/9896032.html
Copyright © 2020-2023  润新知