封装

封装:目的对外提供接口,隐藏内部属性

1.数据属性: __x = 1 变形为: _A__x = 1

2.函数属性 def __foo(self):变形为: def _A__foo(self):

class A:

    __x =10

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

def __foo(self):  #函数属性   变形为def _A__foo(self):
    print('run foo')

def bar(self):
    self.__foo()
    
 a = A('egon')  #实例化一个对象
a._A__foo()    #访问属性: 从实例化对象的角度访问类里面的方法即函数
print(a._A__x)
a.bar()

访问属性: 从类的的角度访问,方法同样

print(A._A__x) #从1
print(A._A__foo) #从<function A.__foo at 0x000000000217FAE8>

实例1:

class Teacher:

    def init(self, name, age):
        self.__name = name
        self.__age = age
        def tell_info(self):
    print('姓名:%s,年龄:%s' % (self.__name, self.__age))
    t = Teacher('egon', 18)

t.tell_info() #在外部访问内部的隐藏属性,就需要通过一个接口进行间接

实例2:

class ATM:
    def __card(self):
        print('插卡')
        
def __auth(self):
    print('用户认证')

def __input(self):
    print('输入取款金额')

def __print_bill(self):
    print('打印账单')

def __take_money(self):
    print('取款')

def withdraw(self):
    self.__card()
    self.__auth()
    self.__input()
    self.__print_bill()
    self.__take_money()
    a = ATM()
	a.withdraw()    

@property

是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

property在类调用方法时,让感知不到是在调用方法

@property与封装(隐藏)的应用

class People:
    def init(self,name):  #定义属性  一步
        self.__name=name
@property  #使用者可以向访问数据属性一样直接访问,
def name(self):
    return self.__name
    p = People('egon')

print(p.name)
类定义为隐藏属性时,想要访问内部属性,只能开一个接口,定义一个方法进行访问来实现,但是从外部访问时是一个方法(函数)
此时加上@property之后,就可以直接在外部访问,而且不用加括号的形式访问

@property与类(非隐藏)的应用:

class Room:
    def __init__(self,name,width,length):
        self.name=name
        self.width=width
        self.length=length
@property  ##使用者可以向访问数据属性一样直接访问,
def area(self):
    return self.width * self.length

r1=Room('alex',5,5)
print(r1.area,'====')
相当于@property是一种伪装使用者调用时,就相当于调他的方法,同时意味着方法必须有一个返回值
原文地址:https://www.cnblogs.com/sunny7/p/9715496.html