zoukankan      html  css  js  c++  java
  • 类里面的 @staticmethod,@classmethod,@property

    关于@staticmethod:

    返回函数的静态方法,该方法不强制要求传递参数

    文档里面的解释是:静态方法不会收到隐式的第一个参数

    @staticmethod 静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包

    该函数不传入 self 或者 cls

    class demo(object):
       @staticmethod
       def f():
           print "跑起来了"

    demo().f()       # 第一种方式调用
    demo.f() #第二种
    res = demo() #第三种
    res.f()

    方法加入了 @staticmethod 就不需要加上参数 self 了,上图如果去掉 @staticmethod 就会报错

    使用staticmethod的原因是如果您有一些可以作为独立函数编写的东西(不是任何类的一部分),但是您希望将其保留在类中,因为它在某种程度上与类相关。(例如,它可以是一个不需要来自类的任何信息的函数,但是它的行为是特定于类的,因此子类可能希望重写它。)在许多情况下,编写一些与独立函数而不是staticmethod一样有意义

     

    关于@classmethod

    classmethod修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的cls 参数,可以用来调用类的属性,类的方法,实例化对象等

    class demo(object):
       bar = 1
       def func1(self):
           print "这是function1"

       @classmethod
       def func2(cls):
           print "这是function2"
           print cls.bar
           cls().func1()


    # demo.func1()   # 报错,想调用 func1 必须实例化
    demo.func2()
    # 结果:
    # 这是function2
    # 1
    # 这是function1

     

    关于@property

    可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改

    class demo(object):
       def __init__(self, value):
           self.data1 = value

       @property
       def az(self):
           return self.data1

       @az.setter       # 设置
       def az(self, data):
           self.data1 = data

       @az.deleter      # 删除
       def az(self):      
           self.data1 = 0

    datas = demo(30)
    print datas.az    # 30

    datas.az = 123
    print datas.az    # 123

    del datas.az
    print datas.az    # 0

     

  • 相关阅读:
    C# 设计模式-抽象工厂模式
    C# 设计模式-工厂方法模式
    C# 设计模式-简单工厂模式
    C# 设计原则-迪米特法则(最少知识原则)
    C# 设计原则-接口隔离原则
    阻止右击事件并更改为自定义导航栏;
    今日头条滚动新闻版块特效
    抓包工具
    查看页面加载速度
    插件那点事
  • 原文地址:https://www.cnblogs.com/yanruizhe/p/15126785.html
Copyright © 2011-2022 走看看