加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python的类访问控制、私有属性

发布时间:2020-12-20 10:52:10 所属栏目:Python 来源:网络整理
导读:一、访问控制私有属性 ?使用双下划线开头符属性名,就是私有属性 ?私有变量的本质:类定义的时候,如果声明一个实例变量的时候,使用双下划线,python解释器会将其改名;?转换名称为_类名_变量名的名称,所以用原来的名字访问不到了 class Person: def __ini

一、访问控制私有属性

  • ?使用双下划线开头符属性名,就是私有属性
  • ?私有变量的本质:类定义的时候,如果声明一个实例变量的时候,使用双下划线,python解释器会将其改名;?转换名称为_类名_变量名的名称,所以用原来的名字访问不到了
class Person:
    def __init__(self,name,age=19):
        self.name = name
        self.__age = age
    
    def growup(self,i=1):
        if i > 0 and i < 150:
            self.__age += 1

p1 = Person(tom)
p1.growup(20)
print(Person.__dict__)
print(p1.__dict__)
#print(p1.__age)  # 不能访问

    通过上面实例可以看出,外部已经访问不到__age了,age根本就没有定义,更是访问不到
    通过方法来访问
    如:
        def getage(self):
            return self.__age
        print(p1.getage())
        


1、保护变量

  • 在变量名前使用一个下划线,称为保护变量,和普通的属性一样,解释器不会做任何特殊的处理,只是个约定
class Person:
    def __init__(self,age=19):
        self.name = name
        self._age = age


2、私有方法本质

  • ?单下划线的方法只是开发者之间的约定,解释器不做任何改变
  • ?双下划线的方法,是私有方法,解释器会改名,改名策略和私有变量相同
  • ?方法变量都在类的__dict__中可以找到

3、属性装饰器

  • ?property装饰器:后面跟的函数名就是以后的属性名,它就是getter,这个必须有,有了它至少是只读属性
  • ?setter装饰器:与属性名同名,且接收2个参数,第一个是self,第二个是将要赋值的值,有了它,属性可写
  • ?deleter装饰器:可以控制是否删除属性,很少用到
  • property装饰器必须在前,setter,deleter装饰器在后,property装饰器能通过简单的方式,把对方法的操作变成对属性的访问,并起到了一定隐藏效果

?

    一般好的设计是:把实例的属性保护起来,不让外部直接访问,外部使用getter读取属性和setter方法设置属性
    class Person:
    def __init__(self,age=19):
        self.name = name
        self.__age = age
        
    def age(self):
        return self.__age
    
    def set_age(self,age):
        self.__age = age
    tom = Person(Tom)
    print(tom.age())
    tom.set_age(20)
    print(tom.age())  
    
    以上通过age 和set_age方法操作属性
    
通过属性装饰器来实现以上代码
        
class Person:
    def __init__(self,age=19):
        self.name = name
        self.__age = age
        
    @property        # 属性装饰器
    def age(self):
        return self.__age
    
    @age.setter     #更改属性
    def age(self,age):
        self.__age = age
        
    @age.deleter
    def age(self):   #属性删除
        #def self.__age
    
tom = Person(Tom)
print(tom.age)
tom.age = 20
print(tom.age)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读