python基礎08
阿新 • • 發佈:2021-02-19
私有屬性和私有方法
1.私有屬性
class Dog():
def __init__(self):
self.name = '3月'
self.__age = 12 # 私有屬性
dog = Dog()
print(dog.name)
print(dog.__age)
- 加上兩個下劃線將屬性變成私有屬性
- print(dog.__age)呼叫私有屬性不可以
執行結果:
再看下面這個更好的理解私有屬性
class Dog():
def __init__(self):
self.name = '3月'
self.__age = 12 # 私有屬性
dog = Dog()
dog.name = '哈士奇'
dog.__age = 13
print(dog.name)
print(dog.__age)
- dog.name = ‘哈士奇’
dog.__age = 13
現在我們對屬性重新賦值 - dog.__age = 13 這個屬性是公有屬性,只不過正好名字相同。所以才能打印出來
執行結果:
想要訪問私有屬性,用公有方法
class Dog():
def __init__(self):
self.name = '3月'
self. __age = 12 # 私有屬性
# 利用公有方法,給私有屬性賦值
def set_age(self,age):
self.__age=age
# 利用公有方法,返回私有屬性的值
def get_age(self):
return self.__age
dog = Dog()
dog.set_age(14)
print(dog.get_age())
-
def set_age(self,age): if age > 0: self.__age=age 將set_age函式寫成這樣我們就可以對私有屬性的值進行校驗 我們呼叫dog.set_age(-1)的時候仍然返回14
2.私有方法
class Tmall():
def buy(self):
return '購買成功'
def check_money(self,money):
if money < 100:
print('金額不夠')
else:
return self.buy()
t = Tmall()
print(t.check_money(200))
執行結果:
- 但是如果直接呼叫buy的話也會返回‘購買成功’
t = Tmall()
print(t.buy())
所以要想解決這個問題就要將buy()改成私有方法
class Tmall():
def __buy(self):
return '購買成功'
# 利用公有方法 呼叫私有方法
def check_money(self,money):
if money < 100:
print('金額不夠')
else:
return self.__buy()
t = Tmall()
# print(t.check_money(200))
print(t.__buy())
- 改成私有方法以後再通過
t = Tmall()
print(t.__buy())
來呼叫將要報錯 - 私有方法可以避免物件直接呼叫
類屬性
通過下面的例子來理解類屬性
先建立一個狗類
class Dog():
def __init__(self, name):
self.name = name # 例項屬性
dog = Dog('哈士奇')
print(dog.name)
現在我們要統計建立了多少隻狗
class Dog():
count = 0 # 類屬性
def __init__(self, name):
self.name = name # 例項屬性
Dog.count += 1
dog = Dog('哈士奇')
print(dog.name)
dog = Dog('阿拉斯加')
print(dog.name)
dog = Dog('藏獒')
print(dog.name)
print(dog.count)
- 類屬性就是外部函式的區域性變數
- 我們要在__init__()方法中遞加是因為每次建立__init__()一定首先執行
- Dog.count += 1
用Dog.count而不是self.count是因為count是類屬性應該用類去點他
執行結果:
下面來區分一下類屬性、私有類屬性、例項屬性、私有例項屬性:
class Dog():
count = 0 # 類屬性
__count = 0 # 私有類屬性
def __init__(self, name):
self.name = name # 例項屬性
Dog.count += 1
self.__age = 12 # 私有例項屬性
dog = Dog('哈士奇')
print(dog.name)
dog = Dog('阿拉斯加')
print(dog.name)
dog = Dog('藏獒')
print(dog.name)
print(dog.count)
對私有屬性的呼叫要用公有方法
class Dog():
count = 0 # 類屬性
__count = 0 # 私有類屬性
def __init__(self, name):
self.name = name # 例項屬性
Dog.count += 1
self.__age = 12 # 私有例項屬性
Dog.__count += 1
def get_age(self):
return self.__age
def get_count(self):
return Dog.count
dog = Dog('哈士奇')
print(dog.name)
dog = Dog('阿拉斯加')
print(dog.name)
dog = Dog('藏獒')
print(dog.name)
print(dog.count)
print(dog.get_age())
print(dog.get_count())
- 無論是私有例項屬性還是私有類屬性,都是不想讓外部直接訪問,要通過公有方法才可以
- 例項屬性字首是self
類屬性是類的屬性字首是類名
執行結果: