博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
论 静态方法@staticmethod 类方法@classmethod @property属性
阅读量:7123 次
发布时间:2019-06-28

本文共 2719 字,大约阅读时间需要 9 分钟。

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_priceobj = Goods()obj.price         # 获取商品价格obj.price = 200   # 修改商品原价del obj.price     # 删除商品原价

         

转载于:https://www.cnblogs.com/huazhou695/p/9896032.html

你可能感兴趣的文章
bzoj 3028 食物——生成函数
查看>>
MongoDB资料汇总
查看>>
写给运维兄弟
查看>>
myeclips快捷键和自动提示设置
查看>>
《GettingThingsDone》--GTD学习笔记(三)-GTD的三个关键原则
查看>>
libvirt(virsh命令总结)
查看>>
OD调试6—使未注册版软件的功能得以实现
查看>>
I.MX6 查找占用UART进程
查看>>
Ubuntu 搭建 LAMP 服务器
查看>>
The Elements of Programming Style
查看>>
简述一下src与href的区别
查看>>
跨域请求被拒绝的问题
查看>>
第六天
查看>>
POJ 1256:Anagram
查看>>
cocos2dx 云彩特效
查看>>
poj3140(树的dfs)
查看>>
Castle ActiveRecord的一对多问题
查看>>
VM安装系统时提示硬件不支持(unsupported hardware detected)
查看>>
mmap探究
查看>>
那些常用的eclipse快捷键
查看>>