在python世界里,是没私有变量这种概念的,那么如何才能对我们的变量进行保护呢?我想到的就是property这种方式,我们来看一下类。
class Person():
def __init__(self,i_name):
self.h_name=i_name
oneperson=Person("小明")
print(oneperson.h_name)
oneperson.h_name = '小红'
print(oneperson.h_name)
#-->小明
#-->小红
我们直接使用类.变量名是可以直接访问的,如果我们不希望我们的属性被随意改变,那么我们可以模拟java或c++的方式来处理,封装成对外的方法,我们程序来修改一下。
class Person():
def __init__(self,i_name):
self.h_name=i_name
def getName(self):
return self.h_name
def setName(self,i_name):
self.h_name = i_name
oneperson=Person("小明")
print(oneperson.getName())
oneperson.setName("小红")
print(oneperson.h_name)
#-->小明
#-->小红
通过代码,我们可以看到使用getName方法跟setName方法是可以实现对变量的读与写的。
说了这么多,还没有说到property用法怎么使用。property方法传两个变量,第一个是获取变量的方法名,第二参数是设置的方法,然后赋值给一个变量,我们通过对这个变量的读取与赋值来实现python风格的写法。上代码。
class Person():
def __init__(self,i_name):
self.h_name=i_name
def getName(self):
return self.h_name
def setName(self,i_name):
self.h_name = i_name
name = property(getName,setName)
oneperson=Person("小明")
print(oneperson.name)
oneperson.name="小红"
print(oneperson.name)
#-->小明
#-->小红
我们可以看到,通过这个property()我们就实现python风格的赋值方式
其实我们还有其他的处理方式,比如我们可以使用我们的修饰器来控制,上代码
class Person():
def __init__(self,i_name):
self.h_name=i_name
@property
def name(self):
return self.h_name
@name.setter
def name(self,i_name):
self.h_name = i_name
oneperson=Person("小明")
print(oneperson.name)
oneperson.name="小丽"
print(oneperson.name)
#-->小红
#-->小丽
如果是我们变量只允许读,不允许修改,则只需要把@name.setter方法去掉就好
class Person():
def __init__(self,i_name):
self.h_name=i_name
@property
def name(self):
return self.h_name
# @name.setter
# def name(self,i_name):
# self.h_name = i_name
oneperson=Person("小明")
print(oneperson.name)
oneperson.name="小丽"
print(oneperson.name)
=============我是有底线的=======================
小明
AttributeError Traceback (most recent call last)
Cell In[36], line 14
11 oneperson=Person("小明")
13 print(oneperson.name)
---> 14 oneperson.name="小丽"
15 print(oneperson.name)
AttributeError: property 'name' of 'Person' object has no setter
这样就限制变重写。实际上我们还可以这么保护我们内部变量,但是python是开源的注定了我们无法正真的保护起来。
class Person():
def __init__(self,i_name):
self.__name=i_name
@property
def name(self):
return self.__name
@name.setter
def name(self,i_name):
self.__name = i_name
oneperson=Person("小明")
print(oneperson.__name)
================我是有底线的=======================
AttributeError Traceback (most recent call last)
Cell In[40], line 13
9 self.__name = i_name
11 oneperson=Person("小明")
---> 13 print(oneperson.__name)
AttributeError: 'Person' object has no attribute '__name'