在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}