python私有属性供外界访问的三种方法(面向对象 封装)

方法一:get , set 方法 。

方法二:property方法

方法三:通过装饰器@property


1.在一个类中,写了__str__(self)方法和不写的区别

class User(object):
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

    def __str__(self):
        return "name = " + self.name
       

u1 = User("张三","19","female")
print(u1)
>>>#打印结果
name = 张三 

class User(object):
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender
       

u1 = User("张三","19","female")
print(u1)
>>>#打印结果
<__main__.User object at 0x000001A55AB7E940>  #对象在内存里存的地址

2.私有属性不能供外界访问,私有属性前有两个下划线如:__name、__age.....

解决这一问题三个方法

①get( ) 和 set( )

②property 方法 (此方法需要借助于get、set方法)

③通过装饰器 装饰器:@property

下面依次说明:

class User(object):
    def __init__(self,name,age,gender):
        self.__name = name #此处的name、age、gender都是私有属性
        self.__age = age
        self.__gender = gender

    def __str__(self):
        return "name = " + self.__name

u1 = User("张三","19","male")
print(u1.__name) #私有属性不能供外界访问
>>>
发生异常:'User' object has no attribute '__name' 

方法一:get , set 方法 。

访问私有属性可以用这个方法,但在使用过程中需要频繁的调用自定义方法

比如说:想更改一次年龄时,就需要u1.set_age("年龄")

#定义两个私有属性age,gender
#1.get()方法-------定义对私有属性的get方法,获取私有属性
class User(object):
    def __init__(self,name,age,gender):
        self.name = name
        self.__age = age
        self.__gender = gender

    def __str__(self):
        return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender

    def get_age(self):    
        return self.__age 

u1 = User("张三","19","female")
print(u1.get_age())
>>>
19

#2.set()方法------定义对私有属性的重新赋值的set方法,重置私有属性
class User(object):
    def __init__(self,name,age,gender):
        self.name = name
        self.__age = age
        self.__gender = gender

    def __str__(self):
        return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender

    def set_age(self,age): #解决手段二 调用set方法,并更改属性值
        self.__age = age

u1 = User("张三","19","female")
u1.set_age("25")
print(u1)
>>>
我的姓名是:张三 , 我的年龄是:25 , 我的性别是:female

#get()和set()
class User(object):
    def __init__(self,name,age,gender):
        self.name = name
        self.__age = age
        self.__gender = gender

    def __str__(self):
        return "我的姓名是:" + self.name + " , 我的年龄是:" + self.__age + " , 我的性别是:" + self.__gender

    def get_age(self):  
        return self.__age 

    def set_age(self,age):
        self.__age = age

u1 = User("张三","19","female")
print(u1.get_age())
u1.set_age("25")
print(u1)
>>>
19
我的姓名是:张三 , 我的年龄是:25 , 我的性别是:female

方法二:property方法

property方法是对get , set 方法的封装。

class User(object):
    def __init__(self,name,age,gender):
        self.__name = name #此处的name、age、gender都是私有属性
        self.__age = age
        self.__gender = gender

    def __str__(self):
        return "name = " + self.__name +", age = " + self.__age + ", gender = " + self.__gender
                    
    def get_name(self):
        return self.__name 
   
    def set_name(self,name):
        self.__name = name

    namer = property(get_name,set_name) #property里面放两个参数,get方法和set方法

u1 = User("张三","19","male")
print(u1.namer)       #要获取对象里的属性时,调property里的第一个参数即get方法
u1.namer = "王五"     #要修改对象里的属性时,调property里的第二个参数即set方法
print(u1)

>>>
张三
name = 王五, age = 19, gender = male

方法三:通过装饰器@property

通过装饰器@property 在get方法上进行装饰,在@property下写的代码,跟写get方法意义一样。set方法通过 名称.setter来直接进行装饰(注意:名称要和@property下定义的方法名一致)

class User(object):
    def __init__(self,name,age,gender):
        self.__name = name #此处的name、age、gender都是私有属性
        self.__age = age
        self.__gender = gender

    def __str__(self):
        return "name = " + self.__name + ", age = " + self.__age + " , gender = " + self.__gender
    #property下面默认跟的是get方法
    @property             
    def name(self): #1处
        return self.__name 
    #这里的@后跟的是 上面的函数名.setter
    @name.setter  
    def name(self,name):
        self.__name = name

u1 = User("张三","19","male")
#调用 对象.属性 时,自动触发执行@property修饰的name方法,默认执行get的方法 
print(u1.name) 
#调用 对象.属性 = xxx 时,自动触发执行@name.setter修饰的name方法
u1.name = "lisa" 
print(u1)

>>>
张三
name = lisa, age = 19 , gender = male

  • 8
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值