一 python自动化基础能力:3.python基础上之数据类型,函数(17)


增加了程序的安全性 。
4.可以在读取属性和设置属性的方法中做一些其他的操作 。
class Dog:def__init__(self,name,age):self.hidden_name = nameself.hidden_age = agedef speak(self):print('Hello,I\'m %s'%self.hidden_name)def get_name(self):#获取对象的属性return self.hidden_namedef set_name(self,name):#修改对象属性self.hidden_name = namedef get_age(self):#获取对象的属性return self.hidden_agedef set_age(self,age):#修改对象属性self.hidden_age = aged = Dog('erha',5)print(d.get_age())d.set_age(-5)print(d.get_age())
打印
5-5
显然,把狗的年龄设为负值程序是没报错的,但是是没有实际意义的,所以我们可以增加对数据的判断 。
class Dog:def__init__(self,name,age):self.hidden_name = nameself.hidden_age = agedef speak(self):print('Hello,I\'m %s'%self.hidden_name)def get_name(self):#获取对象的属性return self.hidden_namedef set_name(self,name):#修改对象属性self.hidden_name = namedef get_age(self):#获取对象的属性return self.hidden_agedef set_age(self,age):#修改对象属性#判断再处理if age > 0:self.hidden_age = aged = Dog('erha',5)print(d.get_age())d.set_age(-5)print(d.get_age())
打印
55
8.封装进阶
class Person():def __init__(self,name):self.hidden_name = namedef get_name(self):return self.hidden_namedef set_name(self,name):self.hidden_name = namep = Person('Tom')p.set_name('Jerry')print(p.get_name())
打印Jerry,即属性值会改变 。改为
class Person():def __init__(self,name):self.__name = namedef get_name(self):return self.__namedef set_name(self,name):self.__name = namep = Person('Tom')print(p.get_name())
打印Tom
class Person():def __init__(self,name):self.__name = namedef get_name(self):return self.__namedef set_name(self,name):self.__name = namep = Person('Tom')print(p.__name)
会报错: ''has no''
class Person():def __init__(self,name):self.__name = namedef get_name(self):return self.__namedef set_name(self,name):self.__name = namep = Person('Tom')p.__name = 'Jerry'print(p.get_name())
打印还是Tom,没有被修改 。
总结:可以为对象的属性使用双下划线开头,__xxx 。
双下划线开头的属性是类的隐藏属性,隐藏属性只能在类的内部访问,无法通过外部访问 。
隐藏属性是自动为属性改了一个名字,实际改的名字是:类名_属性名:
->
class Person():def __init__(self,name):self.__name = namedef get_name(self):return self.__namedef set_name(self,name):self.__name = namep = Person('Tom')print(p.get_name())p._Person__name = 'Jerry'print(p.get_name())
打印
TomJerry
即又可以对属性进行修改 。
在写代码的时候,可以用一个下划线,既容易书写,外部能访问,且不易被修改 。
一般情况下:使用_开头的属性都是私有属性,没有特殊情况不要修改 。
9.装饰器@
用来将get()方法转化为对象的属性 。
添加装饰器以后,就可以像调用属性一样调用方法 。
class Person():def __init__(self,name):self._name = namedef name(self):return self._namep = Person('Tom')print(p.name())