Python之類的成員

一、私有變量和私有方法

私有屬性分爲兩類分別是對象的私有變量以及類的靜態私有變量,除了變量外,還有私有方法;在類中,所有私有的屬性和方法都是在變量的左邊加上雙下劃線的方式定義,所有的私有變量和私有方法都不能在類的外部使用

class Person():
    __pwd = "123456"  # 私有靜態變量

    def __init__(self,name,price):
        self.name = name
        self.__price = price   # 私有變量

    # 私有方法
    def __add_price(self):
        return self.__price*2

eric= Person("eric",20000000)
# 私有變量和方法無法在外部調用,雖然可以通過_類名__屬性名方式調用私有變量,但不提倡使用
print(eric._Person__price)
print(eric._Person__pwd)
print(eric._Person__add_price())
20000000
123456
40000000

二、類的屬性

python的屬性其實是普通方法的變種
有兩種定義方式:
1、普通方法加上property裝飾器
2、在類中定義值爲property對象的靜態字段

property裝飾器方式

property是一種特殊的屬性,當我們訪問被property裝飾的函數時,執行函數內的代碼,得到返回值。

from math import pi

class Circle():
    def __init__(self,radius):
        self.radius = radius

    @property
    def perimeter(self):
        return 2*pi*self.radius

    @property
    def area(self):
        return self.radius**2*pi

c1 = Circle(5)

# 未帶裝飾器調用方法
# print(c1.area())

# 帶裝飾器時當成屬性調用
print(c1.area)

使用property裝飾器定義屬性時,要注意被property裝飾的普通方法只能有self一個參數,並且在調用時不需要加()。

在python3之後,所有的類默認繼承了object,所以說,所有的類都是新式類,新式類的property有三種訪問方式,並分別對應了三個被@property、@方法名.setter、@方法名.deleter修飾的方法

class Goods(object):

    def __init__(self):
        # 原價
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    @property
    def price(self):
        # 實際價格 = 原價 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    @price.setter
    def price(self, value):
        self.original_price = value

    @price.deleter
    def price(self):
        del self.original_price

obj = Goods()
print(obj.price)         # 獲取商品價格
obj.price = 200   # 修改商品原價
del obj.price     # 刪除商品原價

靜態字段方式

靜態字段方式沒有新式類和經典類的區別;靜態字段定義方式也有三種訪問方式:分別對應了三個被@property、@方法名.setter、@方法名.deleter修飾的方法

class Person():
    def __init__(self,name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self,newname):
        self.__name = newname

    def del_name(self):
        del self.__name

    NAME = property(get_name,set_name,del_name)   #定義property靜態字段

obj = Person("eric")

print(obj.NAME)     #調用get_name方法
obj.NAME = "111"    #調用set_name方法
del Person.NAME     #調用del_name方法

三、類的方法

方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬於類,區別在於調用方式不同。

普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self;
類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類複製給cls;
靜態方法:由類調用;無默認參數;
class Goods():
    __discount = 0.8
    def __init__(self,name,price):
        self.name = name
        self.__price = price

    def price(self):   # 普通方法
        return self.__price*Goods.__discount

    @classmethod
    def change_discount(cls,new_discount):  # 類方法
        cls.__discount = new_discount

    @staticmethod
    def get_user_pwd():     #靜態方法
        user = input('please input username: ')
        pwd = input('please input pwd: ')

apple = Goods('apple',10)
Goods.change_discount(0.9)   # 類方法調用
Goods.get_user_pwd()         # 靜態方法調用

小結:
1、類方法
類方法是把一個方法,變成一個類中的方法,這個方法就直接可以被類調用,不需要通過對象來調用;
類方法一般用於只涉及操作靜態變量時使用。
2、靜態方法
一個函數,在與對象以及類沒什麼關係的情況下,要完全的面向對象編程,此時,就可以用staticmethod將這個函數變成類中的靜態方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章