众所周知, 像 Java,C++ 这些语言中都有 private 这种修饰符, 一般声明类的时候, 我们都用 private 声明一个属性, 然后给它写一个 get 方法和一个 set 方法, 可能有人有疑问, 为啥不直接写成 public 呢?
这个问题我也想过, 其实最主要的作用说白了就是一个限制作用, 比如:
- setAge(int age){
- if(age<1||age>120)
- throw new Exception("你输入的年龄不合法");
- }else{
- this.age=age;
- }
其次的一些作用包括写上 get 和 set 的时候, IDE 可以将该类的所有属性提示出来, 不过这是小作用.
那么, 在 Python 中我们怎么写 get 和 set 方法呢?
在说之前, 我还是想吐槽, Python 设计感觉特别不正规, 因为 Python 中没有 private, 属性前面加个__(两个下划线) 就是私有属性了, 你要是真是也就罢了, 实际上呢? 就是给人家改个名字. 比如:
- class AAA(object):
- def __init__(self, name):
- self.__name = name
- def main():
- a = AAA('陈驰')
- # print(a.__name) # 这里肯定打印找不到
- print(a.__dict__)
- print(a._AAA__name)
- if __name__ == '__main__':
- main()
运行结果:
是不是很 low? 就给你改了个名字, 就变成私有的了. 我要是想改, 我只需要
- a._AAA__name = '石泽涛'
- print(a._AAA__name)
- print(a.__dict__)
结果就变成了:
唉, 算了算了, 今天不吐槽了. 这里总结一下 Python 的 get 和 set 方法吧.
传统写法
- class Money(object):
- def __init__(self):
- self.__money = 0
- def getMoney(self):
- return self.__money
- def setMoney(self, value):
- if isinstance(value, int):
- self.__money = value
- else:
- print("error: 不是整型数字")
就是仿照的 Java 的写法.
高级写法 1
采用 property 的类属性方式:
- class Money(object):
- def __init__(self):
- self.__money = 0
- def getMoney(self):
- return self.__money
- def setMoney(self, value):
- if isinstance(value, int):
- self.__money = value
- else:
- print("error: 不是整型数字")
- # 定义一个属性, 当对这个 money 设置值时调用 setMoney, 当获取值时调用 getMoney
- money = property(getMoney, setMoney)
- a = Money()
- a.money = 100 # 调用 setMoney 方法
- print(a.money) # 调用 getMoney 方法
- #100
高级写法 2
采用 property 的装饰器方式:
- class Money(object):
- def __init__(self):
- self.__money = 0
- # 使用装饰器对 money 进行装饰, 那么会自动添加一个叫 money 的属性, 当调用获取 money 的值时, 调用装饰的方法
- @property
- def money(self):
- return self.__money
- # 使用装饰器对 money 进行装饰, 当对 money 设置值时, 调用装饰的方法
- @money.setter
- def money(self, value):
- if isinstance(value, int):
- self.__money = value
- else:
- print("error: 不是整型数字")
- a = Money()
- a.money = 100
- print(a.money)
来源: http://www.bubuko.com/infodetail-2946433.html