簡單理解python中的類

2021-08-21 13:35:38 字數 3916 閱讀 9564

一.屬性:

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 是通過引用呼叫的。這意味著函式內對引數的改變會影響到原始物件。不過事實上只有可變物件會受此影響,對不可變物件來說,它的行為類似按值呼叫。如...