zoukankan      html  css  js  c++  java
  • python的类访问控制、私有属性

    一、访问控制私有属性

    •  使用双下划线开头符属性名,就是私有属性
    •  私有变量的本质:类定义的时候,如果声明一个实例变量的时候,使用双下划线,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,name,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,name,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,name,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)
  • 相关阅读:
    nsurlSession
    IOS 锁
    常见问题
    xcode编译太慢
    ios之keychain
    iOS多线程系列(四)----GCD之Dispatch Queues
    iOS多线程系列(三)----NSOperationQueue
    iOS多线程系列(二)------NSOperation
    iOS多线程系列(一)------NSThread
    kvm虚拟机最佳实践系列3-kvm克隆和静态迁移
  • 原文地址:https://www.cnblogs.com/jiangzuofenghua/p/11413671.html
Copyright © 2011-2022 走看看