C# 对象作为参数_史上最全 Python 面向对象编程( 六 )


成员保护与访问机制
有些对象你不想外部访问,即使是通过调用类对象也无法访问,那就请认真学完本章节 。
私有成员
class obj:def __init__(self,name):self.name=namedef pri(self):print self.name__age = 18# 加上双下划线的就是私有变量,只能在类的内部访问,外部无法访问a = obj('zhao')a.pri()
运行结果:
zhao
如果要在类中调用这个私有成员,可以这么用
class obj:def __init__(self,name):self.name=namedef prin(self):print self.name__age = 18# 加上双下划线的就是私有变量,只能在类的内部访问,外部无法访问@classmethod# 如果要在类中调用,首先调用类方法def pri(cls):print cls.__age# 然后在使用a = obj('zhao')a.prin()obj.pri()# 通过这样直接调用类中的私有变量
运行结果:
zhao18
使用get-set-del方法操作私有成员
class obj:def __init__(self,name):self.name=namedef prin(self):print self.name__age = 18# 加上双下划线的就是私有变量,只能在类的内部访问,外部无法访问@classmethod# 如果要在类中调用,首先调用类方法def pri(cls):print cls.__age# 然后在使用@classmethoddef set_age(cls,value):cls.__age = valuereturn cls.__age# 这个用法就是改变__age的值@classmethoddef get_age(cls):return cls.__age# 这个用法就是直接返回__age的值@classmethoddef del_age(cls):del cls.__age# 这个用法就是直接删除__age的值print obj.get_age()# 这里是直接调用出__age的值返回值18print obj.set_age(20)# 这里是直接改变__age的值返回值20obj.del_age()# 这里是直接删除__age的值
思考: 既然是私有变量,不让外部访问,为何有要在后面调用又改变呢?因为可以对私有变量进行额外的检测,处理,加工等等 。比如判断value的值,使用然后做if-else判断 。
使用私有变量可以对内部变量进行保护,外部无法改变,但是可以对它进行检测处理 。
这里引申一下私有成员的保护机制,使用__age对私有变量其实就是—>obj.的样子进行保护,说白了你直接使用obj.就可以直接调用内部私有变量age了 。
装饰器
把类的方法伪装成属性调用的方式,就是把类里面的一个函数,变成一个属性一样的东西~
一开始调用类的方法要使用圆括号,现在变成了属性进行读取设置存储 。
举个例子来说明:
常用的调用方法
class obj:def __init__(self,name,age):self.__name=nameself.__age=age# 讲这些设置成私有变量def get_age(self):return self.__agedef set_age(self,value):if isinstance(value,int):self.__age=valueelse:raise ValueError('非整数类型')def del_age(self):print 'delete over'a = obj('langzi',18)print a.get_age()a.set_age(20)print a.get_age()
使用装饰器
class obj:def __init__(self,name,age):self.__name=nameself.__age=age# 把这些设置成私有变量@propertydef age(self):return self.__age@age.setterdef age(self,value):if isinstance(value,int):self.__age=valueelse:raise ValueError('非整数类型')@age.deleterdef age(self):print 'delete over'a = obj('langzi',18)# 使用这些装饰器,可以使用类与对象的方法直接调用print a.age# 这里就是直接调用返回age的值a.age=20# 这里就是直接使用setter把值转换print a.agedel a.age# 删除age
当然这种调用方法有些麻烦,每次都是一个一个去实例类与对象,有个更加简单直观的方法 。
更加减半的使用()函数
除了使用装饰器的方式将一个方法伪装成属性外,内置的模块中的()函数,为我们提供了第二种设置类属性的手段 。
class People:def __init__(self, name, age):self.__name = nameself.__age = agedef get_age(self):return self.__agedef set_age(self, age):if isinstance(age, int):self.__age = ageelse:raise ValueErrordef del_age(self):print("删除年龄数据!")# 核心在这句age = property(get_age, set_age, del_age, "年龄")obj = People("jack", 18)print(obj.age)obj.age = 19print("obj.age:", obj.age)del obj.ag