Python中的類屬性、例項屬性與類方法、靜態方法
阿新 • • 發佈:2019-02-10
1、什麼是類物件,例項物件
類物件:類名
例項物件:類建立的物件
2、類屬性就是類物件
所擁有的屬性,它被所有類物件
的例項物件
所共有,在記憶體中只存在一個副本,這個和C++、Java中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類物件
和例項物件
訪問
類屬性
# 類屬性 class people: name="Tom" #公有的類屬性 __age=18 #私有的類屬性 p=people() print(p.name) #例項物件 print(people.name) #類物件 # print(p.__age) #錯誤 不能在類外通過例項物件訪問私有的類屬性 print(people.__age) #錯誤 不能在類外同過類物件訪問私有的類屬性
例項屬性
class people:
name="tom"
p=people()
p.age=18
print(p.name)
print(p.age) #例項屬性是例項物件特有的,類物件不能擁有
print(people.name)
#print(people.age) #錯誤:例項屬性,不能通過類物件呼叫
也可以將例項屬性放在構造方法中class people: name="tom" def __init__(self,age): self.age=age p=people(18) print(p.name) print(p.age) #例項屬性是例項物件特有的,類物件不能擁有 print(people.name) # print(people.age) #錯誤:例項屬性,不能通過類物件呼叫
類屬性和例項屬性混合
class people: name="tom" #類屬性:例項物件和類物件可以同時呼叫 def __init__(self,age): #例項屬性 self.age=age p=people(18) #例項物件 p.sex="男" #例項屬性 print(p.name) print(p.age) #例項屬性是例項物件特有的,類物件不能擁有 print(p.sex) print(people.name) #類物件 # print(people.age) #錯誤:例項屬性,不能通過類物件呼叫 # print(people.sex) #錯誤:例項屬性,不能通過類物件呼叫
# 如果在類外修改類屬性,必須通過類物件去引用然後進行修改。如果通過例項物件去引用,
# 會產生一個同名的例項屬性,這種方式修改的是例項屬性,不會影響到類屬性,並且如果通過
# 例項物件引用該名稱的屬性,例項屬性會強制遮蔽掉類屬性,即引用的是例項屬性,除非刪除了該例項屬性
class Animal:
name="Panda"
print(Animal.name) #類物件引用類屬性
p=Animal()
print(p.name) #例項物件引用類屬性時,會產生一個同名的例項屬性
p.name="dog" #修改的只是例項屬性的,不會影響到類屬性
print(p.name) #dog
print(Animal.name) #panda
# 刪除例項屬性
del p.name
print(p.name)
class Test:
num=100 #類屬性
def __init__(self):
self.age=18 #例項屬性
test1=Test()
test2=Test()
# test1.age=19
# test2.age=20
print(test1.num) #100
test1.num=200 #如果通過物件去修改類屬性,那麼Python會自動給這個物件和這個類屬性相同名字的例項屬性
print(test1.num) #200,只是修改了副本
print(Test.num) #100
del test1.num #刪除之後,仍能列印
print(test1.num)
3、類方法
是類物件所擁有的方法,需要用修飾器@classmethod
來標識其為類方法,對於類方法,第一個引數必須是類物件,一般以cls
作為第一個引數(當然可以用其他名稱的變數作為其第一個引數,但是大部分人都習慣以'cls'作為第一個引數的名字,就最好用'cls'了),能夠通過例項物件和類物件去訪問。
class people:
country="china"
@classmethod
def getCountry(cls):
return cls.country
p=people()
print(p.getCountry()) #例項物件呼叫類方法
print(people.getCountry()) #類物件呼叫類方法
類方法還有一個用途就是可以對類屬性進行修改:
class people:
country="china"
@classmethod
def getCountry(cls):
return cls.country
@classmethod
def setCountry(cls,country):
cls.country=country
p=people()
print(p.getCountry()) #例項物件呼叫類方法
print(people.getCountry()) #類物件呼叫類方法
p.setCountry("Japan")
print(p.getCountry())
print(people.getCountry())
4、靜態方法
需要通過修飾器@staticmethod
來進行修飾,靜態方法不需要多定義引數
class people3:
country="china"
@staticmethod
def getCountry():
return people3.country
p=people3()
print(p.getCountry()) #例項物件呼叫類方法
print(people3.getCountry()) #類物件呼叫類方法
從類方法和例項方法以及靜態方法的定義形式就可以看出來,類方法的第一個引數是類物件cls,那麼通過cls引用的必定是類物件的屬性和方法;而例項方法的第一個引數是例項物件self,那麼通過self引用的可能是類屬性、也有可能是例項屬性(這個需要具體分析),不過在存在相同名稱的類屬性和例項屬性的情況下,例項屬性優先順序更高。
靜態方法中不需要額外定義引數,因此在靜態方法中引用類屬性的話,必須通過類物件來引用