实现python的静态成员 与 property()的理解
静态变量的声明与调用
“静态”变量的声明
这里的静态变量是借用Java中静态变量的概念(不知道Python中的具体概念是什么),指既可以通过类名直接进行访问,也可以通过类的实例进行访问的变量。这种变量的声明很简单,直接在类代码块中设置变量即可,不需要任何关键字
Java中这样声明的变量是实例变量,只能通过对象实例进行访问
class Test:
#这是一个“静态”变量
className = “Test”
# 静态成员变量
class Apple(object):
eaten_by = []
def __init__(self):
pass
def eaten(self,str):
print(f'{str} is eating')
Apple.eaten_by.append(str)
apple1 = Apple()
apple2 = Apple()
apple3 = Apple()
apple1.eaten('Henry')
apple2.eaten('Tom')
apple2.eaten('Kristin')
del apple1
del apple2
del apple3
print(Apple.eaten_by)
property()
property()是装饰器的变型。设计它的主要初衷是为了防止外部直接调用类中的变量,破坏了封装性。因此计划让外界改变“中介变量”,也就是被赋值为property()的变量。他的get,set和del都会导致类内变量的改变,具体改变方式则通过传入property()的函数类型实参决定。同时把类内成员变量设为private,这样就可以限制外部随意调用类内成员变量啦。
# 测试property()的装饰器作用
# 测试property()对改善封装性的作用
# 通过一个隐藏的变量(property类型)作为中介实现类间消息传输,改变成员变量等等。
class Person():
def __init__(self):
self.__drive = False
self.__car = ''
self.__client_name = ''
def setINFO_client(self,info):
print('SET!!!')
self.__car = info[0]
self.__client_name = info[1]
self.__drive = info[2]
self.description()
def getINFO_client(self):
print('GET!!!')
self.description()
return self.__car,self.__client_name,self.__drive
def description(self):
if self.__drive == False:
print('nobody drives you')
else:
print('client {} drives you with car of {}'.format(self.__client_name,self.__car))
info = property(getINFO_client,setINFO_client)
p = Person()
p.info = ('Benz','Henry',True)
print(p.info)