1、私有成员与公有成员
- 以两个下划线开头但不以两个下划线结束表示是私有成员
- 私有成员 在类的外部不能直接访问
>>> class Test:
def setValue(self,value):
self.__value = value #在类的内部可以直接访问私有成员
def show(self):
print(self.__value)
>>> t = Test(0)
>>> t.show()
0
在python中,以下划线开头或结束的成员名有特殊的含义:
1、_xxx: 以一个下划线开头为保护成员,不建议通过对象直接访问
2、__xxx: 以两个下划线开头不以两个下划线结束表示私有成员
3、xxx: 系统定义的特殊成员
2、数据成员
数据成员用来描述类或对象的某些特征或属性,可以分为属于对象的数据成员和属于类的数据成员两类。
- 属于类的数据成员主要在构造方法__init__()中定义(也就是类的特殊成员)
- 属于类的数据成员的定义 不在任何 成员方法 之内,是该类的所有成员共享的,不属于任何一个对象。
class SingleInstance:
num = 0
def __init__(self):
if SingleInstance.num >0 :
raise Exception('只能创建一个对象')
SingleInstance.num += 1
t1 = SingleInstance()
t2 = SingleInstance() #再次定义一个对象时会报错
3、成员方法
python的成员方法可以分为 公有方法、私有方法、静态方法和类方法。公有方法和私有方法一般是指属于对象的实例方法。其中私有方法是以两个下划线开始的,私有方法不能通过对象名直接访问。
所有实例方法都必须至少一个名为self的参数,并且必须是方法的第一个形参,self参数代表当前对象。在实例方法中访问实例成员时需要以self为前缀,但在外部通过对象名调用时并不需要传递这个参数,因为通过对象调用公有方法时会把对象隐式绑定到self参数。
静态方法和类方法都可以通过类名和对象名调用,但这两种方法中不能直接访问属于对象的成员,只能访问属于类的成员。一般以cls作为类方法的第一个参数表示该类自身。
class Root:
__total = 0
def __init__(self,v): #构造方法,特殊方法
self.__value = v
self.__total += 1
def show(self): #普通实例方法,公有方法
print('self.__value: ',self.__value)
print('Root.__total: ',Root.__total)
@classmethod #修饰器,声明类方法
def classShowTotal(cls): #静态方法,可以没有参数
print(cls.__total)
@staticmethod
def staticShowTotal():
print(Root.__total)
4、属性
属性是一种特殊形式的成员方法。
class Test:
def __init__(self,value):
self.__value = value
@property #修饰器,定义属性
def value(self):
return self.__value
下面将代码设置为可读、可修改。不允许删除
class Test:
def __init__(self,value):
self.__value = value
def __get(self):
return self.__value #可读属性
def __set(self,v):
self.__value = v #修改私有数据成员的值
value = property(__get,__set) #可读可写属性,指定相应的读写方法
def show(self):
print(self.__value)
也可以将属性设置为可读、可修改、可删除。
class Test:
def __init__(self,value):
self.__value = value
def __get(self):
return self.__value #可读属性
def __set(self,v):
self.__value = v #修改私有数据成员的值
def __del(self):
del self.__value
value = property(__get,__set,__del) #可读可写属性,指定相应的读写方法
def show(self):
print(self.__value)