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)