python学习面向对象之property的用法

在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'


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值