python:使用@property对类的私有对象修改访问实例

我以为我会了,上手发现我还是不会。


(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.csdn.net/keepaware/article/details/111655393

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值