Python類總結-封裝(私有屬性,方法)


封裝基礎

  • 廣義上面向對象的封裝:代碼的保護,面向對象的思想本身就是一種封裝

  • 只讓自己的對象能調用自己類中的方法

  • 狹義上的封裝-面向對象三大特性之一(私有變量,用公有的方法封裝私有屬性,方法叫封裝)

  • 把屬性和方法都藏起來,不讓你看見

  • 類的特性

    • 所有的私有,都是在變量左邊加雙下划線
    • 所有的私有,都不能在類的外部使用
    • 對象的私有屬性
    • 類的私有方法
    • 類中私有的靜態屬性
class Person:
    def __init__(self, name, password):
        __key = 123 #靜態私有屬性
        self.name = name
        self.__password = password #在類的內部定義私有屬性,會轉換為_Person__password
    def get_pwd(self): #通過公有方法get_pwd封裝私有屬性
        return self.__password #返回__私有屬性
    
    def __set_pwd(self):#私有方法
        print('set new password')
    def changepwd(self):
        self.__set_pwd()
#所有的私有,都是在變量左邊加雙下划線
#所有的私有,都不能在類的外部使用
#對象的私有屬性
#類的私有方法
#類中私有的靜態屬性
alex = Person('alex', 'alex3714')
# print(alex.__password)#外部不可調用
print(alex.__dict__)
print(alex.get_pwd())#讀取共用方法調取私有屬性

使用set方法設置類變量

class Room:
    def __init__(self,name, length, width):
        self.__name = name
        self.__length = length #私有屬性
        self.__width = width
    def get_name(self):
        return self.__name
    def set_name(self,newName):#使用set方法可以規范變量的屬性
        if type(newName) is str and newName.isdigit() == False:#設置規范類的變量不可以是數字
            self.__name = newName
        else:
            print('不合法的姓名')
        return self.__name

    def area(self):
        return self.__length*self.__width #返回私有屬性計算值

jin = Room('金老板', 2,1)
print(jin.area())

jin.name ='二哥'
print(jin.name)

jin.set_name('2') #傳set_name數字則不修改
print(jin.get_name())
jin.set_name('東東') #傳set_name字符則修改
print(jin.get_name())

>>>
2
二哥
不合法的姓名
金老板
東東

父類的私有屬性可以被子類調用嗎? 不可以

class Foo:
    __key = '123' #變形為_Foo__Key

class Son(Foo):
    print(Foo.__key) #變形為_Son__key何父類不相同

>>>
  File "C:/Users/jwang2/PycharmProjects/PlayPy/Demo/S9-day25-封裝.py", line 62, in Son
    print(Foo.__key)
AttributeError: type object 'Foo' has no attribute '_Son__key'

總結-會用到私有概念的場景

  • 隱藏起一個屬性,不想讓外部調用
  • 保護這個屬性,不想讓這個屬性隨意改變
  • 保護這個屬性不被子類繼承


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM