那么在实际应用中,我们具体怎么使用呢?
有时,我们在定义一个类时,需要设置私有属性,外部可以访问,但是不希望外部对属性进行更改。
class Person(object): def __init__(self): self._name = "小明" # 但下划线开头表示这是私有属性,但是外部依然可以访问更改 self._age = 18 self._gender = "男" # 查看私有属性 person_1 = Person() print(person_1._name) print(person_1._age) print(person_1._gender) 小明 18 男 # 对私有属性进行修改 person_2 = Person() person_2._name = "小红" print(person_2._name) print(person_2._age) print(person_2._gender) 小红 18 男可以通过@property的方法来进行设置。这样可以隐藏属性名,让用户进行使用的时候无法随意修改。
class Person(object): def __init__(self): self._name = "小明" self._age = 18 self._gender = "男" @property def name(self): return self._name @property def age(self): return self._age @property def gender(self): return self._gender person_1 = Person() # 通过调用方法的方式查看属性,使用者不需要知道属性值,只需要知道该方法 print(person_1.name) # 使用调用属性的方式调用方法,后面不需要加() print(person_1.age) print(person_1.gender) 小明 18 男此时,我的疑惑是将方法当作属性一样访问能有什么好处呢?看了以下代码就明白了
class Person(object): def __init__(self,name,age,gender=None): self._name = name self._age = age self._gender = gender person_1 = Person("小明","男性") name = person_1._name age = person_1._age print("{}的年龄是:{}".format(name,age)) 小明的年龄是:男性以上的代码在设置年龄时并没有检查年龄的类型,所以"男性"被当作年龄赋值给了age。为了避免这个错误,我们在设置属性值的时候,需要添加一个set方法,用来检查输入的属性值是否正确
class Person(object): def __init__(self,name=None,age=None,gender=None): self._name = name self._age = age self._gender = gender def set_age(self,age): # 设置年龄属性 if isinstance(age,int): self._age = age else: raise ValueError("请输入int类型") def get_age(self): # 获取年龄 return self._age person_1 = Person("小明") age_set = person_1.set_age("男性") # 输入错误的age类型 name = person_1._name age = person_1.get_age() print("{}的年龄是:{}".format(name,age)) ValueError Traceback (most recent call last) <ipython-input-100-d071f5fc5e66> in <module>() 1 person_1 = Person("小明") ----> 2 age_set = person_1.set_age("男性") 3 name = person_1._name 4 age = person_1.get_age() 5 print("{}的年龄是:{}".format(name,age)) <ipython-input-98-b6d73e549a9e> in set_age(self, age) 10 return self._age 11 else: ---> 12 raise ValueError("请输入int类型") 13 14 def get_age(self): ValueError: 请输入int类型 person_1 = Person("小明") age = person_1.set_age(18) name = person_1._name print("{}的年龄是:{}".format(name,age)) 小明的年龄是:18以上的代码虽然正确,但是不是很麻烦,设置年龄需要person_1.set_age(),获取年龄需要 age = person_1.get_age(),如果使用@property方法呢?
以上我们看出,@property装饰的作用下,设置和获取属性时我们只需要person_1.age 来实现,是不是简单很多呢?
