1. 程式人生 > >python之property、類方法和靜態方法

python之property、類方法和靜態方法

new 增刪改查 turn 引用 dict 沒有 不同的 保護 實例化

一、完整的property
1、定義
一個方法被偽裝成屬性之後,應該可以執行一個屬性的增刪改查操作,
增加和修改就對應著被setter裝飾的方法,
刪除一個屬性對應著被deleter裝飾的方法。

@property:把方法偽裝成屬性

@被property裝飾的方法名.setter:
當被property裝飾的方法,又實現了一個同名方法,且被setter裝飾器裝飾了,
那麽在對被裝飾的方法賦值的時候,就會觸發被setter裝飾器裝飾的方法,
這個方法必須要傳一個參數接收等號後面的值,
是用來保護一個變量在修改的時候能夠添加一些保護條件。

@被property裝飾的方法名.deleter:
當被property裝飾的方法,又實現了一個同名方法,且被deleter裝飾器裝飾了,


那麽在對被裝飾的方法進行刪除的操作時,就會觸發被deleter裝飾器裝飾的方法,
這個方法並不能在執行的時候真的刪除這個屬性,而是你在代碼中執行什麽就有什麽效果.


2、例題

學生類
class Student:
    def __init__(self,name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self,new):
        if type(new) is
str: #因為名字是字符串類型的,我們這樣設置可以保證只能用字符串修改名字 self.__name = new @name.deleter def name(self): del self.__name xiaoming = Student(小明) print(xiaoming.name) #小明 xiaoming.name = 123 # 不是字符串修改不了 print(xiaoming.name) # 小明 xiaoming.name = 小花貓 print(xiaoming.name) #
小花貓 del xiaoming.name print(xiaoming.__dict__) # {} 空字典 水果類: class Fruits: __discount = 0.7 def __init__(self,price): self.__price = price @property def price(self): return self.__price * Fruits.__discount @price.setter def price(self,new): if type(new) is int or float: self.__price = new @price.deleter def price(self): del self.__price banana = Fruits(10) print(banana.price) # 折扣價7.0 banana.price = 9 print(banana.price) # 折扣價6.3 del banana.price print(banana.__dict__) # {} 空字典


3、總結:
被setter和deleter裝飾的方法名必須和被property裝飾的方法名一致,對象.方法名 不加括號 可以調用被property裝飾的方法,
當對被property裝飾的方法賦值時,就會觸發被setter裝飾的方法,當對被property裝飾的方法進行刪除del操作時,就會觸發
被deleter裝飾的方法。
註意:(一般來說用的最多的是property,其他兩個看情況而使用)

二、類方法:
用@classmethod裝飾
通過類名調用
類方法默認形參用cls表示,而不用self
可以直接通過類去修改類的屬性,不需要實例化

class Fruits:
    __discount = 0.7  # 類的靜態屬性

    def __init__(self,price):
        self.__price = price  # 對象的私有屬性

    @property
    def price(self):
        return self.__price * Fruits.__discount

    @classmethod
    def change_discount(cls,new):  # 類方法默認形參用cls表示,而不用self
        cls.__discount = new


Fruits.change_discount(0.6)
print(Fruits.__dict__)  # ‘_Fruits__discount‘: 0.6

類方法的特點:
只使用類中的資源,且這個資源可以直接用類名引用,那這個方法應該被改為一個類方法


三、靜態方法
被@staticmethod裝飾的方法,不使用類中的命名空間也不使用對象的命名空間,
可以傳參,也可以不傳參,沒有默認參數(self,cls),相當於一個類外的普通的方法,
不同的是調用的時候需要 類名.方法名

class Student:
    @staticmethod
    def login():
        print(登錄成功)

Student.login())

四、類中的方法屬性總結
類:  成員:       標準使用者:    默認形參:
    靜態屬性      類/對象
    類方法       類         cls 表示類
    靜態方法      類
    方法        對象        self 表示對象
    property方法    對象        self 表示對象

註意:有些成員用類和對象都是可以調用的,不過建議按照標準使用者去調用。

五、
1、isinstance:判斷一個對象是否是一個已知的類型
print(type(123) is int) # True
print(isinstance(123,int)) # True


# isinstance還可以檢測對象與類之間的關系(包括繼承)
# type不能檢測繼承關系

class A:
    pass
class B(A):
    pass
a = A()
b = B()


print(type(a) is A) # True
print(type(b) is B) # True
print(type(b) is A) # False

print(isinstance(a,A)) # True
print(isinstance(b,B)) # True

# 子類是父類的類型,但是父類不是子類的類型
print(isinstance(b,A)) # True
print(isinstance(a,B)) # False

2、issubclass:檢測類與類之間的關系
用法:issubclass(子類,父類)

class A:
    pass
class B(A):
    pass
print(issubclass(A,B))  # False
print(issubclass(B,A))  # True

python之property、類方法和靜態方法