python @property,@staticmethod及@classmethod内置装饰器小结

本文详细介绍了Python中的三种装饰器:@property、@staticmethod和@classmethod。通过具体示例,展示了如何使用@property装饰器实现属性的封装和校验,@staticmethod装饰器用于定义与类和实例无关的静态方法,以及@classmethod装饰器如何绑定类对象,实现类级别的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰器相关知识传送门——https://blog.youkuaiyun.com/weixin_43533825/article/details/87823860

一、@property装饰器

@property的作用是将类里的方法变成属性,同时可以对属性进行校验检查,简化代码,减少出错的概率

正常类和实例化,属性调用示例代码:

class user(object):
    
    def get_username(self):
        return self._username
    def set_username(self,value):
        self._username=value

if __name__=='__main__':
    a=user()
    a.set_username("sdf")
    print a.get_username()
sdf

采用@property装饰器后的示例代码:加上@property把get方法变成属性,@property本身创建的username.setter装饰器把set方法变成属性赋值;这里如果只定义get方法,那属性只有只读属性;在属性赋值中可以对属性进行校验检查,这样使用@property可以让程序员写出简短的代码,同时保证对参数进行必要检查,减少出错

#coding:utf-8
class user(object):
    @property
    def username(self):
        return self._username
    @username.setter
    def username(self,value):
        if value=="":
            raise ValueError(u"名字不能为空")
        self._username=value

if __name__=='__main__':
    a=user()
    a.username="sdf"
    print a.username
    a.username=''
    print a.username

 上述代码如果直接直接用a.username会报错,因为该类没有进行__inti__初始化,没有username这个值

二、@staticmethod装饰器

定义:将被装饰的方法从类中分离独立出来,被装饰的方法不能访问类和实例的属性,不允许使用self;这样的方法其实是类的工具包,与类和实例都没有绑定关系,但类和实例都可以调用该方法

应用场景:

  • 限制作用域:区别于普通函数,这个函数只能被该类调用;
  • 代码易读性:不允许使用self参数
  • 节省内存:被装饰的方法与类和实例都没有绑定关系,所以即使没有实例化也可以通过类调用该方法

三、@classmethod装饰器

@classmethod只能访问类的变量,不能访问实例的变量,通过cls(只是习惯写cls,跟self一样,约定俗成)参数传递类对象,绑定类对象,类和实例对象都可以调用被装饰的方法

常用方法,@staticmethod以及@classmethod的定义,调用方式以及绑定对象示例代码如下:

#coding:utf-8
class demo(object):
    name="test"
    
    def __init__(self,name):
        self.name=name
    
    def func(self,value):
        print "func running: "+value 
        
    @staticmethod
    def static_func(value):
        print "static_func running: "+value
      
    @classmethod
    def class_func(cls,value):
        print "classmethod: "+cls.name+" "+value
        
if __name__=='__main__':
    #类初始化
    a=demo("demotest")
    
    #实例调用方法
    a.static_func("statcimethod")
    a.class_func("classmethod")
    a.func("normalmethod")
    #类调用方法
    demo.static_func("staticmethod")
    demo.class_func("classmethod")
    
    #绑定对象
    print a.func
    print a.static_func
    print a.class_func
    
    print demo.static_func
    print demo.class_func
    
    
static_func running: statcimethod
classmethod: test classmethod
func running: normalmethod
static_func running: staticmethod
classmethod: test classmethod
<bound method demo.func of <__main__.demo object at 0x06BC9130>>
<function static_func at 0x06BC6B70>
<bound method type.class_func of <class '__main__.demo'>>
<function static_func at 0x06BC6B70>
<bound method type.class_func of <class '__main__.demo'>>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值