python访问可见性与@property装饰器

本文讨论了Python中的访问可见性问题,包括私有变量的实现与访问,并介绍了@property装饰器的使用,用于创建安全且方便的属性访问。通过实例展示了如何使用@property创建getter和setter方法,以控制属性的读取和修改。同时强调了Python类的动态特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

访问可见性问题

  • 在python中,希望变量不要随便调用,将变量私有化
    1、私有变量,变量前加“__”
    2、如果非要使用私有变量,可以用dir(class())去查看它真正的名字。
    3、私有变量/函数,在类内部可以直接调用
    4、如果想要体现一个变量/函数特别重要可以使用“_"
  • 实例:
class Test:
	def __init__(self,foo):
		self.foo = foo
	def __bar(self):
		print(self.__foo)
		print('__bar')
	
	def main():
		test = Test('hello')
		 //AttributeError: 'Test' object has no attribute '__bar'
		 test.__bar()
		 //AttributeError: 'Test' object has no attribute '__foo'
if __name__ =="__main__":
	main()
  • 以上可见:python没有从语法上严格保证私有属性或方法的私密性,它只是给私有属性或方法取了一个艺名来“妨碍”对它们的访问。
  • 练习:写一个邮箱注册在这里插入图片描述
import random
class mailbox(object):
    def __init__(self):
        print("网易邮箱注册")
    def name(self):
        res = input("输入邮箱地址")
        print("您输入的邮箱是:%s" % res)
        //在类内直接调用,防止出现字条输入错误仍然继续运行下一个def的问题
        self.password()
    def password(self):
        //for循环四次停止
        for i in range(4):
            self.one = input("设置密码")
            self.two = input("确认密码")
            if self.one == self.two:
                print("设置成功")
                //在break之前调用下一个要运行的def
                self.yanzhengma()
                break
            else:
                print("两次密码不一致")
        else:
            print('您可能是个机器人,再见')
    def yanzhengma(self):
        for i in range(3):
            self.b = random.randrange(1000,9999)
            print("验证码是:%d"%self.b)
            self.checking = int(input("输入验证码"))
            if self.b == self.checking:
                print("验证成功")
                self.tele()
                break
            else:
                print("验证失败")
        else:
            print("机器人,再见")
    def tele(self):
        tele = input("输入手机号")
        print("您输入的手机号是:%s"%tele)
    //message部分未补全
    def message(self):
        pass
    def success(self):
        print("注册成功")
        
    
mailbox=mailbox()
mailbox.name()
mailbox.success()
//结果:
//网易邮箱注册
//输入邮箱地址123
//您输入的邮箱是:123
//设置密码123
//确认密码123
//设置成功
//验证码是:2493
//输入验证码2493
//验证成功
//输入手机号15587878787
//您输入的手机号是:15587878787
//注册成功

property装饰器

  • 在python中,,属性和方法的访问权限只有两种,公开与私有,私有的表达方式为,给属性命名时用两个下划线作为开头;但不建议将属性设为私有,但直接将属性暴露给外界也是有问题的,比如我们没办法检查赋给属性的值是否有效。

  • 默认操作:将属性命名以单下划线为开头,暗示属性是受保护的,不建议外界直接访问。

  • 若要访问属性,可以通过属性的getter(访问器)setter(修改器) 方法进行对应操作;
    语法是: @property@name.setter ; 使得对属性的访问既安全又方便。
    1、装饰器名,函数名需一致
    2、property需要先声明,再写setter,顺序不可颠倒
    3、如果你希望变量只是被访问不能被修改,那么可以使用访问器@property
    4、如果要修改访问器中的变量,可以搭建一个修改器,或者删除访问器

  • 实例:

class Person(object):
   def __init__(self, name, age):
       self._name = name
       self._age = age

  	 // 访问器 - getter方法
 	  @property
  	def name(self):
       	return self._name

  	 //访问器 - getter方法
   @property
   def age(self):
       return self._age

  	 // 修改器 - setter方法
   @age.setter
   def age(self, age):
       self._age = age

	def play(self):
      	 if self._age <= 16:
           print('%s正在玩飞行棋.' % self._name)
       else:
           print('%s正在玩斗地主.' % self._name)


def main():
   person = Person('王大锤', 12)
   person.play()
   person.age = 22
   person.play()



if __name__ == '__main__':
   main()
//王大锤正在玩飞行棋.
//王大锤正在玩斗地主.
  • 练习1、输入三个数字(私有),求三个数字的和,尝试更改其中两个数字
class he(object):
    //定义三个变量
    def __init__(self,a,b,c):
        self._a=a
        self._b=b
        self._c=c
        
    //访问器 - getter方法    
    @property
    def bb(self):
        return self._b
    
    @property
    def cc(self):
        return self._c
        
    //修改器 - setter方法
    //@bb.setter这个命名需要与@property的def bb(self):命名一致
    @bb.setter
    //此处B为新命名变量赋给要运算的self._b这个值
    def bb(self,B):
        self._b=B
    
    @cc.setter
    def cc(self,C):
        self._c=C
        
    def SUM(self):
        print(self._a+self._b+self._c)
        
he = he(1,2,3)
he.SUM()
//修改其中一个数字
he.bb=44
he.SUM()

//结果:
//6
//48
  • 练习2、创建一个隐私空间,默认情况下只能被查看,当你输入密码正确的情况下,才能被修改
class secret(object):
    def __init__(self):
        self._a = "隐私空间"
        
    //允许访问
    @property
    def aa(self,A):
        return self._a
    
    def mimi(self):
        mima = int(input("输入:"))
        if mima == 123456:
            print(self._a)
        else:
            print("密码错误")
    

    
    
he = secret()
he.mimi()
//运行结果:
//输入:123456
//隐私空间

//输入:123
//密码错误
class secret(object):
    def __init__(self):
        self._a = "隐私空间"
    
    def mimi(self):
        mima = int(input("输入:"))
        if mima == 123456:
            return True
        else:
            return False

    @property
    def aa(self):
        return self._a
    
    @aa.setter
    def aa(self,A):
        res=self.mimi()
        if res == True:
            self._a = A
        else:
            print('ERROR')
    
    
he = secret()
he.aa = 456
he.aa

//结果:输入:123456
//456
  • 在python中,类是动态的
  • 实例:
class Num(object):
    def __init__(self):
        self.a = 1000
    
    def A(self):
        print(self.b)


num = Num()
num.b =1000000
# print(num.a)
print(num.b)
num.A()

//输出结果:
//1000000
//1000000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值