python进阶学习Day13

本文介绍了Python中property的特性,包括其作为描述符的工作原理,以及如何通过fget/fset/fdel方法实现属性的获取、设置和删除。同时,展示了使用@property装饰器和自定义__str__,__call__方法的实例。
摘要由CSDN通过智能技术生成

在Python中,property是一种特殊的属性,可以把它看作一个描述符(descriptor),它可以用于获取、设定、删除属性。
property函数有三个参数:
fget:获取属性的方法
fset:设定属性的方法
fdel:删除属性的方法

当我们使用类似instance.property的方式时,Python会自动调用fget方法。如果我们尝试设置这个属性,例如instance.property = value,Python会自动调用fset方法。如果我们尝试删除这个属性,例如del instance.property,Python会自动调用fdel方法。

以下是一个使用property的简单例子:

class C:
    def __init__(self):
        self._x = None
 
    def getx(self):
        return self._x
 
    def setx(self, value):
        self._x = value
 
    def delx(self):
        del self._x
 
    x = property(getx, setx, delx, "I'm the 'x' property.")
 
c = C()
c.x = 10
print(c.x)  # 输出: 10
del c.x
print(c.x)  # 输出: None

在这个例子中,我们定义了一个私有属性_x,并通过property定义了一个公共属性x。当我们尝试访问或修改x时,Python会自动调用getx、setx和delx方法来实现对私有属性_x的操作。

另外,Python还支持另一种更简洁的property定义方式,使用@property装饰器:

class C:
    def __init__(self):
        self._x = None
 
    @property
    def x(self):
        """I'm the getter of 'x'."""
        return self._x
 
    @x.setter
    def x(self, value):
        self._x = value
 
    @x.deleter
    def x(self):
        del self._x
 
c = C()
c.x = 10
print(c.x)  # 输出: 10
del c.x
print(c.x)  # 输出: None

在这个例子中,我们使用了@property装饰器定义了x的getter方法,使用相应的@x.setter和@x.deleter装饰器定义了x的setter和deleter方法。这种方式更加简洁,推荐在定义只读属性或者需要进行一些计算并返回属性值的情况下使用。

str()方法的作用:
不定义__str__方法,print输出对象实例时,默认打印对象实例的内存地址
定义__str__方法,print输出对象实例时,自动调用此方法
返回值必须是字符串

__call__方法的基本用法
__call__方法可以将一个类的实例作为函数来调用。要使用__call__方法,需要在类中定义它,并在实例中设置相应的属性。
也就是该类被作为函数调用时会调用的魔术方法

import time


class Timer:
    def __init__(self,prefix):
        self.prefix=prefix

    def __call__(self, func):
        def wrapper(*args,**kwargs):
            start=time.time()
            ret=func(*args,**kwargs)
            print(f'{self.prefix}{time.time()-start}')
            return ret
        return wrapper

@Timer(prefix="curr_time:")
def add(a,b):
    return a+b

#等价于add=Timer(prefix="curr_time")(add)

print(add(2,3))

这是一个计时器,这可以作为一个类装饰器
下面是一个类装饰器,装饰器不仅能给函数用,还能给class用,因为class本身也是一个对象(object)

def add_str(cls):
    def __str__(self):
        return str(self.__dict__)
    cls.__str__=__str__
    return cls

@add_str#即等价于Myobjct=add_str(Myobject),之后addstr为Myobject提供了str方法使在print时输出特定形式
class Myobject:
    def __init__(self,a,b):
        self.a=a
        self.b=b

o=Myobject(1,2)
print(o)#结果为{'a': 1, 'b': 2}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值