1. 程式人生 > >python3 私有化 屬性property

python3 私有化 屬性property

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 def
testbug(): _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()

技術分享圖片

  總結:

  1.   父類中屬性名為__名字 的,子類不繼承,子類不能訪問
  2.   如果在子類中向 __名字 賦值,那麽會在子類中定義的一個與父類相同名字的屬性
  3.   _名 的變量、函數、類在使用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