我以为我会了,上手发现我还是不会。
(python3)
要求如上。
修饰器是什么?
@property装饰器:
·把一个方法变成属性调用。
·使用@property可以实现将类方法转换为只读属性,同时可以自定义setter、getter、deleter方法。
·把一个getter变为@property,而@property本身又创建了另一个装饰器。
·@property定义只读属性,@setter定义可读可写属性,@deleter定义可读可写可删除属性
实例:
class Person(object):
# 使用示例
@property
def birth(self):
return self.__birth
@birth.setter
def birth(self,value):
self.__birth=value
@birth.getter
def birth(self):
return self.__birth
@birth.deleter
def birth(self):
del self._birth
# 代码来源:https://www.cnblogs.com/lilip/p/10615571.html
但是我自己上手的error:
class Fan:
def __init__(self, speed=SLOW, on=False,radius=5,color='blue'):
self.__speed = speed
self.__color = color
self.__on =on
self.__radius = radius
@property
def setSpeed(self):
return self.__speed
@setSpeed.setter
def outSpeed(self,speed):
self.__speed = speed
print(self.__speed)
Fan1 = Fan(FAST, True, 10, "yellow")
print(Fan1.setSpeed)
Fan1.outSpeed(MEDIUM)
TypeError: 'int' object is not callable
This inspection checks that arguments to property() and functions annotated with @property and friends look reasonably.
error1
此检查检查property()的参数和用@property和friends注释的函数是否合理。
函数和装饰器的名称不匹配;未创建属性访问器。
按照提示的错误来,改掉函数名称。
def Speed(self, speed):
self.__speed = speed
注意:几个地方的名称保持一致。
现在不提示报错了,但是仍然没有办法操作。
SLOW,MEDIUM,FAST = 1,2,3
class Fan:
def __init__(self, speed=SLOW, on=False,radius=5,color='blue'):
self.__speed = speed
self.__color = color
self.__on =on
self.__radius = radius
@property
def Speed(self):
return self.__speed
@Speed.setter
def Speed(self, speed):
self.__speed = speed
print(self.__speed)
Fan1 = Fan(FAST, True, 10, "yellow")
Fan1.Speed(MEDIUM)
TypeError: 'int' object is not callable.'int' 对象不可调用
error2
格式应该没有问题了下面问题是如何使用我的setter。
直接用就可以了。我还以为这是一个方法。
Fan1.Speed=SLOW
'int' object is not callable对象并不是一个可以被用来调用的东西,只是一个int数字而已。通过加入了setter,虽然是私有变量,但是我们现在仍然能够像公有变量一样正常修改。(我感觉这是修饰器“修饰”的意思)
error3
我特意在每个setter里面放了一个print打印修改的结果,但是__On是bool值打印出来出错。
Fan1.Speed,Fan1.On,Fan1.Color,Fan1.Radius=SLOW,False,"pink",5
#结果:
1
yellow
pink
5
完整代码
SLOW = 1
MEDIUM = 2
FAST = 3
class Fan:
def __init__(self, speed=SLOW, on=False,radius=5,color='blue'):
self.__speed = speed
self.__color = color
self.__on =on
self.__radius = radius
@property
def Speed(self):
return self.__speed
@Speed.setter
def Speed(self, speed):
self.__speed = speed
print(self.__speed)
@property
def Color(self):
return self.__color
@Color.setter
def Color(self,color):
self.__color = color
print(self.__color)
@property
def On(self):
return self.__on
@On.setter
def On(self,on):
self.__on = on
print(self.__color)
@property
def Radius(self):
return self.__radius
@Radius.setter
def Radius(self, radius):
self.__radius = radius
print(self.__radius)
Fan1 = Fan(FAST, True, 10, "yellow")
print(Fan1.Speed,Fan1.Color,Fan1.On,Fan1.Radius)
Fan1.Speed,Fan1.On,Fan1.Color,Fan1.Radius=SLOW,False,"pink",5
plus
·查到了可以用:object._className__attrName 的方法直接调用,但是我运行不了。
·转自MoGu*图片一张。
参考
https://www.cnblogs.com/lilip/p/10615571.html
https://blog.youkuaiyun.com/keepaware/article/details/111655393