Skip to main content

私有属性

1. 私有属性

## 在属性或方法前加__前缀,可以对外进行隐藏
## 这种隐藏对外不对内,因为__开头的属性会在类定义阶段检查语法时统一变形

class Foo:
	__x = 1

	def __test(self):
		print('from test')
     
    def f2(self):
		print(self.__x)  # 1
		print(self.__test) ## <bound method Foo.__test of <__main__.Foo object at 0x000002063304B7F0>>

## 隐藏属性的访问 
## Python不推荐此方法
print(Foo._Foo__x)  ## 1
print(Foo._Foo__test) ##  <function Foo.__test at 0x000001C42976E320>

## 这种变形操作只在检查类语法的时候发生一次,之后定义__定义的属性都不会变形

Foo.__y = 3
print(Foo.__y) 

2. property使用

## 第一种类型
## 把函数像普通属性一样调用
class Person:

    def __init__(self,name):
        self.__name = name

    @property
    def get_name(self):
        return self.__name

aini = Person('yanchen')
print(aini.get_name)  ## 'yanchen'


## 第二种类型
class Person:

    def __init__(self,name):
        self.__name = name


    def get_name(self):
        return self.__name


    def set_name(self,val):
        if type(val) is not str:
            print('必须传入str类型')
            return
        self.__name = val
    
    ## 伪装成数据接口的属性
    name = property(get_name,set_name)

yanchen = Person('yanchen')
print(yanchen.name)  ## 'yanchen'
yanchen.name = 'norah'
print(yanchen.name)  ## 'norah'


## 第三种方法
## 起一个一样的函数名,用不同功能的property装饰
class Person:

    def __init__(self,name):
        self.__name = name

    @property   ## name = property(name)
    def name(self):
        return self.__name

    @name.setter 
    def name(self,val):
        if type(val) is not str:
            print('必须传入str类型')
            return
        self.__name = val
        
    @ name.deleter  
    def name(self):
        print("不能删除")