类:

类是某种类型集合的描述。

我们把拥有相同属性的事务叫做类,里面封装了相同的方法。比如人,汽车等。


对象:

对象是由类创建的实例。对象的三个特性:身份,类型,值,在这里不做描述。


类的私有属性及访问方式:

外部想要访问类的私有属性有两种方式:

1:类内创建一个函数,来返回私有属性

2:类特性


对象的私有字段:

创建一个类如下:

classProvince:memo="中国的23个省之一"#是类的字段,是属于类的,不属于对象,这个属于类的静态字段,属于类def__init__(self,name,captial,leader,flag):self.Name=name#通过self创建的字段叫做动态字段,不像静态字段,动态字段属于对象self.Captial=captialself.Leader=leaderself.__happy=flag#创建对象的私有字段

XZ=Province("西藏","乌鲁木齐","×××",True)#实例化类,就是创建了个对象printXZ.CaptialprintXZ.__happy

执行结果如下:

Traceback(mostrecentcalllast):File"F:\lvsir\workspace\pystudy-oldboy\oop\privat_filld.py",line47,in<module>乌鲁木齐printXZ.__happyAttributeError:Provinceinstancehasnoattribute'__happy'

此例可见,私有字段是外部不可直接访问的;外部若想访问对象的私有字段,可以再在类中创建一个函数,来显示私有字段,代码如下:

classProvince:......defshow(self):#在类中创建一个查看实例私有字段的方法returnself.__happy

XZ=Province("西藏","乌鲁木齐","×××",True)printXZ.show()#调用show方法

执行结果如下:

True


还是上面的例子,添加私有方法代码如下:

classProvince:......def__Hello(self):#定义私有方法,直接使用类实例是访问不到的,在类中可以访问的到print"Hello,world"defaccess_hello(self):#创建一个访问私有方法的函数printself.__Hello()

XZ=Province("西藏","乌鲁木齐","×××",True)printXZ.__Hello

直接访问对象的私有方法,执行结果如下:

Traceback(mostrecentcalllast):File"F:\lvsir\workspace\pystudy-oldboy\oop\privat_filld.py",line49,in<module>printXZ.__HelloAttributeError:Provinceinstancehasnoattribute'__Hello'


使用第一种方法访问私有方法

printXZ.access_hello()#调用类实例的访问私有方法的函数

Hello,world

由上可见,类的私有方法对象是不能直接访问的,也可以通过类内可访问私有方法的方法间接访问


使用类特性访问私有方法:

classProvince:......@property#创建类特性,返回私有方法defHello(self):returnself.__Hello()

XZ=Province("西藏","乌鲁木齐","×××",True)printXZ.Hello#直接调用类特性,以字段的方式访问,不需要带括号

执行结果如下:

Hello,world


类的私有字段的只读和只写

我们创建一个新类,代码如下:

classProvince1:def__init__(self,name,flag):self.name=nameself.__Hello=flag@property#只读的私有字段,是可以访问的,但是不能修改defHeloo(self):returnself.__Hello

TW=Province1('台湾',True)printTW.HelooTW.Heloo=FalseprintTW.Heloo

执行结果如下:

TrueTraceback(mostrecentcalllast):File"F:\lvsir\workspace\pystudy-oldboy\oop\privat_filld.py",line76,in<module>TW.Heloo=FalseAttributeError:can'tsetattribute

是可以读到私有字段的,但是不能修改

下面添加代码,是私有字段可以访问并且可写,前提是类要继承object,代码如下:

classProvince1(object):def__init__(self,name,flag):self.name=nameself.__Hello=flag@property#只读的私有字段,是可以访问的,但是不能修改defHeloo(self):returnself.__Hello@Heloo.setter#可改的私有字段,可以访问,也可以修改,可以的私有字段的类要继承objectdefHeloo(self,value):self.__Hello=value

TW=Province1('台湾',True)printTW.HelooTW.Heloo=FalseprintTW.Heloo

执行结果如下:

TrueFalse