@property
使調(diào)用類中的方法像引用類中的字段屬性一樣。被修飾的特性方法,內(nèi)部可以實現(xiàn)處理邏輯,但對外提供統(tǒng)一的調(diào)用方式。遵循了統(tǒng)一訪問的原則。
示例:
coding: utf-8
class TestClass:
name = "test"
def __init__(self, name):
self.name = name
@property
def sayHello(self):
print "hello", self.name
cls = TestClass("felix")
print "通過實例引用屬性"
print cls.name
print "像引用屬性一樣調(diào)用@property修飾的方法"
cls.sayHello
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
輸出結(jié)果:
通過實例引用屬性
felix
像引用屬性一樣調(diào)用@property修飾的方法
hello felix
1
2
3
4
此外,@property可以用來實現(xiàn)類似與Java中set和get方法
@staticmethod
將類中的方法裝飾為靜態(tài)方法,即類不需要創(chuàng)建實例的情況下,可以通過類名直接引用。到達將函數(shù)功能與實例解綁的效果。
示例:
coding: utf-8
class TestClass:
name = "test"
def __init__(self, name):
self.name = name
@staticmethod
def fun(self, x, y):
return x + y
cls = TestClass("felix")
print "通過實例引用方法"
print cls.fun(None, 2, 3) # 參數(shù)個數(shù)必須與定義中的個數(shù)保持一致,否則報錯
print "類名直接引用靜態(tài)方法"
print TestClass.fun(None, 2, 3) # 參數(shù)個數(shù)必須與定義中的個數(shù)保持一致,否則報錯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
輸出結(jié)果:
通過實例引用方法
5
類名直接引用靜態(tài)方法
5
1
2
3
4
@classmethod
類方法的第一個參數(shù)是一個類,是將類本身作為操作的方法。類方法被哪個類調(diào)用,就傳入哪個類作為第一個參數(shù)進行操作。
實例:
coding: utf-8
class Car(object):
car = "audi"
@classmethod
def value(self, category): # 可定義多個參數(shù),但第一個參數(shù)為類本身
print "%s car of %s" % (category, self.car)
class BMW(Car):
car = "BMW"
class Benz(Car):
car = "Benz"
print "通過實例調(diào)用"
baoma = BMW()
baoma.value("Normal") # 由于第一個參數(shù)為類本身,調(diào)用時傳入的參數(shù)對應的時category
print "通過類名直接調(diào)用"
Benz.value("SUV")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
輸出結(jié)果:
通過實例調(diào)用
Normal car of BMW
通過類名直接調(diào)用
SUV car of Benz
注意,靜態(tài)方法和類方法是為類操作準備的。雖然通過實例也能調(diào)用,但是不建議。