封装

#封装的隐藏
#__开头的属性只是一种语法意义的变形,并不会真的限制外部的访问
#这种变形只在类定义阶段发送一次,类定义以后再新增的__开头的属性不会变形
class foo:
    __n=1  #__对外部隐藏属性。

    def __init__(self,x,y):
        self.x=x
        self.__y=y   #sele._foo__y=y

    def __f1(self):  #_foo__f1
        print('f1')

    def f2(self):
        print(self.__n,self.__y)  #print(self._foo__n,self._foo__y)

print(foo.__dict__)
print(foo._foo__n)
print(foo._foo__f1)

#obj=foo(1,2)
#print(obj._foo__y)

#这种隐藏只对外不对内,由于内部定义的属性在类定义阶段统一发生变形。
foo.__n=2
print(foo.__dict__)
print(foo.__n)

oov=foo(1,2)
oov.f2()

#属性查找指定的函数
class foo:
    def __f1(self):
        print('f1')

    def f2(self):    
        print('f2')
        self.__f1()  #b.f1()

class bar(foo):
    def f1(self): 
        print('bar.f1')

b=bar()
b.f2

#封装的真正意义
class peple:
    def __init__(self,name,age):
        self.set_info(name,age)

    def tell__info(self):
        print('姓名:《%s》,年龄:《%s》' %(self.__name,self.__age))

    def set_info(self,name,age):
        if type(name) is not str:
            raise TypeError('name must be str')
        if type(age) is not int:
            raise  TypeError('age must be int')
        self.__name = name
        self.__age = age

p=peple('abc',18)
#print(p.__dict__)

p.set_info('ad',23)
p.tell__info()

#property
class peope:
    def __init__(self,name,age,height,weight):
        self.name=name
        self.age=age
        self.height=height
        self.weight=weight
    @property   #装饰器,使用一个计算获得的数据属性的值
    def bmi(self):
        return self.weight / (self.height ** 2)

a=peope('abc',37,1.80,63)
#print(a.bmi())
print(a.bmi)

class peo:
    def __init__(self,name,age):
        self.__name=name
        self.age=age
    @property 
    def name(self):
        return self.__name

    @name.setter
    def name(self,obj):
        self.__name=obj

    @name.deleter
    def name(self):
       del self.__name

b=peo('abc',48)
print(b.name)
#修改
b.name='ooo'
print(b.name)
#删除
del b.name
print(b.name)
相关文章
相关标签/搜索