一.屬性:
1:例項屬性:
在__init__方法(self,…)內初始化的屬性
內部呼叫時都需要加上self.
外部呼叫時用例項化物件.屬性名
class people:
name="john"
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) #錯誤:例項屬性,不能通過類物件呼叫
2:類屬性:
在__init__()方法外初始化的屬性
在內部用類名.類屬性名呼叫
外部既可以用類名.類屬性名又可以用例項化物件.類屬性名來呼叫
# 類屬性
class people:
name="tom" #公有的類屬性
__age=18 #私有的類屬性
p=people()
print(p.name) # 通過例項物件訪問類屬性
print(people.name) # 通過類物件訪問
# print(p.__age) #錯誤 不能在類外通過例項物件訪問私有的類屬性
print(people.__age) #錯誤 不能在類外同過類物件訪問私有的類屬性
類屬性與例項屬性:
class people:
name="tom" #類屬性:例項物件和類物件可以同時呼叫
def __init__(self,age): #例項屬性
self.age=age
p=people(18) #例項物件
p.***="男" #例項屬性
print(p.name)
print(p.age) #例項屬性是例項物件特有的,類物件不能擁有
print(p.***)
print(people.name) #類物件
# print(people.age) #錯誤:例項屬性,不能通過類物件呼叫
# print(people.***) #錯誤:例項屬性,不能通過類物件呼叫
2.1 在類外修改屬性
# 如果在類外修改類屬性,必須通過類物件去引用然後進行修改。如果通過例項物件去引用,會產生乙個同名的例項屬性,這種方式修改的是例項屬性(實則是在物件中新增了乙個例項屬性),並不會影響到類屬性,並且如果通過例項物件引用該名稱的屬性,例項屬性會強制遮蔽掉類屬性,即引用的是例項屬性,除非刪除了該例項屬性,若刪除了該例項屬性,遮蔽掉的類屬性會重新顯示列印出來。
1 class animal:
2 name = "ant"
3 4
5 # 如果在類外修改類屬性,必須通過類物件去引用然後進行修改。如果通過例項物件去引用》 ,
6 # 會產生乙個同名的例項屬性,這種方式修改的是例項屬性,不會影響到類屬性,並且如果》 通過
7 # 例項物件引用該名稱的屬性,例項屬性會強制遮蔽掉類屬性,即引用的是例項屬性,除非》 刪除了該例項屬性
8 9
10 print(animal.name) # an t使用類物件引用類屬性
11 p =animal()
12 print(p.name) # ant 使用例項物件引用類屬性
13 p.name = "cat" # 使用例項物件修改類屬性,實則是在物件裡新增了乙個例項屬性
14 print(p.name) # cat
15 print(animal.name) # ant 類屬性
16 17 # 刪除例項屬性
18 del p.name # 使用例項物件刪除的是例項屬性
19 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)
2.2、類方法
是類物件所擁有的方法,需要用修飾器@classmethod
來標識其為類方法,對於類方法,第乙個引數必須是類物件,一般以cls
作為第乙個引數(當然可以用其他名稱的變數作為其第乙個引數,但是大部分人都習慣以'cls'作為第乙個引數的名字,就最好用'cls'了),能夠通過例項物件和類物件去訪問。
1 class people
2 country = "china"
3 4 # 定義乙個類方法
5 @classmethod #修飾器@classmethod用來表示為類方法
6 def getcountry(cls):
7 return cls.country
8 9
10 person = people()
11 print(person.getcountry()) #使用例項物件呼叫類方法
12 print(people.getcountry()) #類物件呼叫類方法
3:私有屬性:
1):單下劃線_開頭:只是告訴別人這是私有屬性,外部依然可以訪問更改
2):雙下劃線__開頭:外部不可通過例項化物件.屬性名來訪問或者更改
實際將其轉化為了_類名_屬性名,只是在內部將變數名修改了,我們仍讓可以通過._類名_屬性名訪問
class test(object):
#類屬性
a = 100
def __init__(self, b):
#例項屬性
self.b = b
t = test(100)
#通過例項化物件訪問 類屬性
print("t.a = %d"%t.a)
#通過類名訪問 類屬性
print("test.a = %d"%test.a)
#通過例項化物件訪問 例項屬性
print("t.b = %d"%t.b)
#通過類名訪問 例項屬性
print("test.b = %d"test.b) #error 無法通過(類名.屬性名)的方式訪問例項屬性
Python中類的理解
x,y本身沒有setdata屬性,python會順著類的連線搜尋,也就是python的繼承,繼承在屬性點號運算時發生的,只於查詢連線物件內的變數名有關。以上 例子中的x.setdata aaa 會傳入self.data中。因為類會產生多個例項,所以必須經過self引數才能獲取正在處理的例項。因為se...
Python中yield的簡單理解
yield常見用法 該關鍵字用於函式中會把函式包裝為generator。然後可以對該generator進行迭代 for x in fun param 在乙個函式中,程式執行到yield語句的時候,程式暫停,返回yield後面表示式的值,在下一次呼叫的時候,從yield語句暫停的地方繼續執行,如此迴圈...
python中的類簡單講解
類似其它的語言,python 中的函式使用小括號 呼叫。函式在呼叫之前必須先定義。如果函式中沒有 return 語句,就會自動返回 none 物件。python 是通過引用呼叫的。這意味著函式內對引數的改變會影響到原始物件。不過事實上只有可變物件會受此影響,對不可變物件來說,它的行為類似按值呼叫。如...