private public

預設成員變數、成員方法都是public,除非在成員變數與方法前加上__二個底線,才會變成private。

語法

__二個底線宣告屬性或方法是私有。
私有屬性、私有方法,只供類別內部讀取與寫入,若要提供外部使用,需提供公有public方法供外部呼叫。

class 類別:
	__私有屬性 = None

	def __私有方法(self):
		程式碼

private 屬性

以下宣告__salary私有屬性,並提供get_salary()與set_salary()公有方法供外部使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Employee:
    name = None
    __salary = None

    def __init__(self, name, salary):
        self.name = name
        self.__salary = salary

    def get_salary(self):
        return self.__salary

    def set_salary(self, salary):
        self.__salary = salary


emp1 = Employee("Mary", 20000)
print(f"name = {emp1.name} salary = {emp1.get_salary()}")
emp1.set_salary(30000)
print(f"name = {emp1.name} salary = {emp1.get_salary()}")
name = Mary salary = 20000
name = Mary salary = 30000

private 方法

私有方法只供內部類別呼叫。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Employee:
    name = None
    level = None
    __salary = None

    def __init__(self, name, level, salary):
        self.name = name
        self.level = level
        self.__salary = salary

    def get_salary(self):
        return self.__salary + self.__bonus()

    def set_salary(self, salary):
        self.__salary = salary

    def __bonus(self):
        if self.level == 1:
            return self.__salary * 0.1
        elif self.level == 2:
            return self.__salary * 0.2
        else:
            return self.__salary * 0.3

emp1 = Employee("Mary", 1, 20000)
print(f"emp1 name = {emp1.name} salary = {emp1.get_salary()}")
emp2 = Employee("Bill", 2, 20000)
print(f"emp2 name = {emp2.name} salary = {emp2.get_salary()}")
emp1 name = Mary salary = 22000.0
emp2 name = Bill salary = 24000.0

類別外私有屬性不可指派值

在類別外,私有屬性設值是沒用。

物件.__私有屬性 = 值

以下程式碼,在類別外,設定__salary為50000,但實際輸出仍是20000

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Employee:
    name = None
    __salary = None

    def __init__(self, name, salary):
        self.name = name
        self.__salary = salary

    def get_salary(self):
        return self.__salary

    def set_salary(self, salary):
        self.__salary = salary

emp1 = Employee("Mary", 20000)
# 以下私有屬性設成50000,無作用
emp1.__salary = "500000"
print(emp1.get_salary())
20000

results matching ""

    No results matching ""