python3 私有化 屬性property
阿新 • • 發佈:2018-03-20
method set 命名沖突 value 導致 http ins 重新 賦值
私有化
xx:公有變量
- _x:單前置下劃線,私有化屬性或方法,from somemodule import *禁止導入,類對象和子類可以訪問
- __xx:雙前置下劃線,避免與子類中的屬性命名沖突,無法在外部直接訪問(名字重整所以訪問不到)
- __xx__:雙前後下劃線,用戶名字空間的魔法對象或屬性。例如__init__,不要自己發明這樣的名字。
- xx_:單後置下劃線,用於避免與Python關鍵值字沖突。
#! /usr/bin/env python3 class Person(object): def __init__(self, name, age, taste): self.name= name self._age = age self.__taste = taste def showperson(self): print(self.name) print(self._age) print(self.__taste) def dowork(self): self._work() self.__away() def _work(self): print(‘my_work‘) def __away(self):print(‘my__away‘) class Student(Person): def construction(self, name, age, taste): self.name = name self._age = age self.__taste = taste def showstudent(self): print(self.name) print(self._age) print(self.__taste) @staticmethod deftestbug(): _Bug.showbug() #模塊內可以訪問,當from cur_module import *時,不導入 class _Bug(object): @staticmethod def showbug(): print(‘showbug‘) s1 = Student(‘jack‘, 25, ‘football‘) s1.showperson() print(‘*‘*20) #無法訪問__taste,導致報錯 #s1.showstudent() s1.construction(‘rose‘, 30, ‘basketball‘) s1.showperson() print(‘*‘*20) s1.showstudent() print(‘*‘*20) Student.testbug()
總結:
- 父類中屬性名為__名字 的,子類不繼承,子類不能訪問
- 如果在子類中向 __名字 賦值,那麽會在子類中定義的一個與父類相同名字的屬性
- _名 的變量、函數、類在使用from xxx import *時不會被導入。
屬性 property
私有屬性添加getter和setter方法
#! /usr/bin/env python3 class Money(object): def __init__(self): self.__money = 0 def getMoney(self): return self.__money def setMoney(self, value): if isinstance(value, int): self.__money = value else: print(‘error:不是整型數字‘)
使用property升級getter和setter方法
#! /usr/bin/env python3 class Money(object): def __init__(self): self.__money = 0 def getMoney(self): return self.__money def setMoney(self, value): if isinstance(value, int): self.__money = value else: print(‘error:不是整型數字‘) money = property(getMoney, setMoney)
使用property 取代getter和setter方法
@property 成為屬性函數,可以對屬性賦值時作必要的檢查,並保證代碼的清晰短小,主要有兩個作用
- 將方法轉換為只讀
- 重新實現一個屬性的設置和讀取方法,可做邊界判定
#! /usr/bin/env python3 class Money(object): def __init__(self): self.__money = 0 @property def money(self): return self.__money @money.setter def money(self, value): if isinstance(value, int): self.__money = value else: print(‘error:不是整型數字‘)
python3 私有化 屬性property