@classmethod, @staticmethod和@property这三个装饰器的使用对象是在类中定义的函数。下面的例子展示了它们的用法和行为:

class MyClass(object):
    def __init__(self):
        self._some_property = "properties are nice"
        self._some_other_property = "VERY nice"
    def normal_method(*args,**kwargs):
        print "calling normal_method({0},{1})".format(args,kwargs)
    @classmethod
    def class_method(*args,**kwargs):
        print "calling class_method({0},{1})".format(args,kwargs)
    @staticmethod
    def static_method(*args,**kwargs):
        print "calling static_method({0},{1})".format(args,kwargs)
    @property
    def some_property(self,*args,**kwargs):
        print "calling some_property getter({0},{1},{2})".format(self,args,kwargs)
        return self._some_property
    @some_property.setter
    def some_property(self,*args,**kwargs):
        print "calling some_property setter({0},{1},{2})".format(self,args,kwargs)
        self._some_property = args[0]
    @property
    def some_other_property(self,*args,**kwargs):
        print "calling some_other_property getter({0},{1},{2})".format(self,args,kwargs)
        return self._some_other_property
o = MyClass()
# 未装饰的方法还是正常的行为方式,需要当前的类实例(self)作为第一个参数。
o.normal_method
# <bound method MyClass.normal_method of <__main__.MyClass instance at 0x7fdd2537ea28>>
o.normal_method()
# normal_method((<__main__.MyClass instance at 0x7fdd2537ea28>,),{})
o.normal_method(1,2,x=3,y=4)
# normal_method((<__main__.MyClass instance at 0x7fdd2537ea28>, 1, 2),{‘y‘: 4, ‘x‘: 3})
# 类方法的第一个参数永远是该类
o.class_method
# <bound method classobj.class_method of <class __main__.MyClass at 0x7fdd2536a390>>
o.class_method()
# class_method((<class __main__.MyClass at 0x7fdd2536a390>,),{})
o.class_method(1,2,x=3,y=4)
# class_method((<class __main__.MyClass at 0x7fdd2536a390>, 1, 2),{‘y‘: 4, ‘x‘: 3})
# 静态方法(static method)中除了你调用时传入的参数以外,没有其他的参数。
o.static_method
# <function static_method at 0x7fdd25375848>
o.static_method()
# static_method((),{})
o.static_method(1,2,x=3,y=4)
# static_method((1, 2),{‘y‘: 4, ‘x‘: 3})
# @property是实现getter和setter方法的一种方式。直接调用它们是错误的。
# “只读”属性可以通过只定义getter方法,不定义setter方法实现。
o.some_property
# 调用some_property的getter(<__main__.MyClass instance at 0x7fb2b70877e8>,(),{})
# ‘properties are nice‘
# “属性”是很好的功能
o.some_property()
# calling some_property getter(<__main__.MyClass instance at 0x7fb2b70877e8>,(),{})
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: ‘str‘ object is not callable
o.some_other_property
# calling some_other_property getter(<__main__.MyClass instance at 0x7fb2b70877e8>,(),{})
# ‘VERY nice‘
# o.some_other_property()
# calling some_other_property getter(<__main__.MyClass instance at 0x7fb2b70877e8>,(),{})
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: ‘str‘ object is not callable
o.some_property = "pythontab"
# calling some_property setter(<__main__.MyClass object at 0x7fb2b7077890>,(‘pythontab‘,),{})
o.some_property
# calling some_property getter(<__main__.MyClass object at 0x7fb2b7077890>,(),{})
# ‘pythontab‘
o.some_other_property = "pythontab.com"
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# AttributeError: can‘t set attribute
o.some_other_property
# calling some_other_property getter(<__main__.MyClass object at 0x7fb2b7077890>,(),{})
时间: 2024-11-13 09:16:32

@classmethod, @staticmethod和@property这三个装饰器的使用对象是在类中定义的函数。下面的例子展示了它们的用法和行为:的相关文章

类中三个装饰器

目录 类中的三个装饰器 一.@classmethod 二.@staticmethod装饰器装饰静态方法 三[email protected] 把一个方法伪装成属性 类中的三个装饰器 装饰类中的方法 @classmethod --->装饰类方法,不用self属性,只用类的cls属性 @staticmethod --->装饰静态方法,既不用self属性,又不用类cls的属性 @property --->把一个方法伪装属性 一.@classmethod 在类中一个方法不用对象属性,但使用静态属

python函数三 (装饰器)

一.函数名(学名:第一类对象) 函数名本质上就是函数的内存地址.通俗点就是特殊的普通变量 def func(): print(111) func() print(func) # 结果: # 111 # <function func at 0x00000150713F6048> 1.可以被引用(即可以赋值给其他变量) def func(): print('in func') f = func f() # 结果: # in func 2.可以被当作容器类型的元素 def func(): print

面向对象-类中的三个装饰器

为了代码更加完善,引入几个装饰器.. 装饰类中的方法 @classmethod    --->装饰类方法,不用self属性,只用类的cls属性 @staticmethod    --->装饰静态方法,既不用self属性,又不用类cls的属性 @property           --->把一个方法伪装属性 下面具体说说他们的用法: [email protected]装饰类方法,那什么是类方法呢? 在类中一个方法不用对象属性,但使用静态属性,那这个方法就是类方法,被classmethod

设计模式(三)_装饰器模式

上篇学习了策略模式,现在回想下,什么是策略模式,好了.本篇主要介绍装饰器模式,just do it! 什么是装饰器模式 装饰器模式指的是动态的将责任附加到对象上.若要扩展功能,装饰器模式提供了比继承更弹性的替代方案. 如何使用装饰器模式 老王来到商场买衣服,需要买衣服,裤子,帽子...... public class Wang { public void show(){ System.out.println("我穿上衣服,累计花费100元"); System.out.println(&

【Python】【Property】关于属性装饰器的优化

简而言之,就是把设置属性所需要的过程修改一下,改成只需要一次装饰就能完成get和set请求(del也可以用同样的原理添加) 代码写得不是最优但是可以参考这个思想: import copy class PropertyTest(object): def __init__(self, fget=None): self.fget = fget self.fset = copy.deepcopy(fget) def __get__(self, instance, owner): return self.

设计模式(三)——装饰器模式(Decorator Pattern)

发现太过于刻意按照计划来写博客,有点不实际,刚好最近在一个网课上复习AOP的知识,讲到了装饰器模式和代理模式,顺便复习总结一下. 首先了解一下装饰器模式,从名字里面可以看出来,装饰器模式就类似于房子装潢吧,比如刚买的毛坯房,只有一个没有门,直接就可以进去. 首先设计一个房子类Room,实现一个进入方法Access /// <summary> /// 抽象接口 用来进行约束 /// </summary> public interface IAccess { void Access()

python 类中的某个函数作为装饰器

在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return wrapped @ wrapper ###装饰mix def mix(): ... 当调用mix的时候,self.mix() ,会将self等参数传入 wrapper 中来吗?答案为否. 当wrapper作为装饰器的并且@wrapper这种方式作为装饰的时候,wrapper就跟普通的函数一样,仅仅

python_如何在类中定义装饰器

案例: 实现一个能将函数调用信息记录到日志的装饰器 需求: 把每次函数的调用时间,执行时间,调用次数写入日志 可以对被装饰函数分组,调用信息记录到不同日志 动态修改参数,比如日志格式 动态打开关闭日志输出功能 如何解决这个问题? 为了装饰器的灵活性,定义一个装饰类,把这个类的实例方法当做装饰器,在类中装饰器方法持有实例对象,便于修改属性和扩展功能 #!/usr/bin/python3 import logging from time import time, strftime, localtim

由浅入深,走进Python装饰器-----第五篇:进阶--类装饰类

**类装饰器** @类 类 4.1 用类装饰器来扩展原类( 增加属性和方法 ) # 用类装饰器来扩展原函数, 通过对象函数化触发__call__方法,进行返回 class KuoZhan(): def __call__(self,cls): return self.newfunc(cls) def good(self): print("新增的方法!") def newfunc(self,cls): def in_newfunc(): cls.addpty = "新增的属性&q