封裝

#封裝的隱藏
#__開頭的屬性只是一種語法意義的變形,並不會真的限制外部的訪問
#這種變形只在類定義階段發送一次,類定義以後再新增的__開頭的屬性不會變形
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)
相關文章
相關標籤/搜索