1. 程式人生 > 其它 >python基礎08

python基礎08

技術標籤:python基礎python

私有屬性和私有方法

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
    類屬性是類的屬性字首是類名

執行結果:
在這裡插入圖片描述