Python中的類學習筆記

2022-10-04 23:54:16 字數 3579 閱讀 7882

python使用中物件導向的語言,支援繼承、多型;

定義乙個person類:

複製** **如下:

>>> class person:

... def sayhello(self):

... print('hello')

...>>> person.sayhello(none)

hello

>>> person().sayhello()

hello

可以修改person的類方法

複製** **如下:

>>> def hack_sayhello(obj):

... print('...hello')

...>>>

>>> person.www.cppcns.comsayhello = hack_sayhello

>>> person.sayhello(none)

...hello

>>> person().sayhello()

...hello

>>> sayhello = person().sayhello

>>> sayhello()

...hello

person().sayhello也是乙個函式,可以賦值給變數,並可以直接呼叫;

複製** **如下:

>>> person.sayhello is person(程式設計客棧).sayhello

false

>>> person.sayhello == person().sayhello

false

person.sayhello與person().sayhello並不是同乙個物件,直覺上,person().sayhello關聯(繫結)了乙個person例項,而person.sayhello是乙個類方法;

self引數事實上正是方法和函式的區別:方法將它們的第乙個引數繫結到所屬的例項上,因此這個引數可以不必提供;

複製** **如下:

>>> class person:

... name = 'unkown'

... def sayhello(self):

... print('i\'m ' + name)

...>>>

>>> person.sayhello(none)

traceback (most recent call last):

file "", line 1, in

file "", line 4, in sayhello

nameerror: name 'name' is not defined

>>> p = person()

>>> p.name = 'wyj'

>>> p.sayhello()

traceback (most recent call last):

file "", line 1, in

file "", line 4, in sayhello

nameerror: name 'name' is not defined

可見,python在解析變數時,預設從local scope/global scope中查詢;

複製** **如下:

>>> class person:

... name = 'unkown'

... def sayhello(self):

... print('i\'m ' + self.name)

...>>>

>>> person.sayhello(none)

traceback (most recent call last):

file "", line 1, in

file "", line 4, in sayhello

attributeerror: 'nonetype' object has no attribute 'name'

>>> p = person()

>>> p.name = 'wyj'

>>> p.sayhello()

i'm wyj

訪問成員都要通過self,假如以包含name屬性的物件呼叫person.sayhello(obj),是否可以呢?

複製** **如下:

>>> class cat:

... name = 'huanhuan'

...>>> person.sayhello(cat())

i'm huanhuan

可以,python並不限制必須用相同類的例項物件作為引數呼叫類方法(貌似python的類機制類似j**ascript);

訪問控制

python並不直接支援私有方訪問,而是要靠程式設計師自己把握。

不過,可以在屬性名稱前加上雙下劃線而給其私有訪問能力(對外不可見);

複製** **如下:

>>> class person:

... def __private_method(self):

... print('private')

... def test(self):

... self.__private_method(程式設計客棧)

...>>> person().test()

private

>>> person().__private_method()

traceback (most recent call last):

file "", line 1, in

attributeerror: 'person' object has no attribute '__private_method'

實際上,以上下劃線打頭的方法都有乙個_classname__methodname的方法

複製** **如下:

>>> person._person__private_method

呼叫複製** **如下:

>>> person._person__private_method(none)

private

總之,python並不能阻止從類外進行方法呼叫;

類屬性以及物件屬性

首先,可以為類新增屬性,新物件將得到屬性的乙份拷貝

複製** **如下:

>>> person.age = 3

>>> person().age

3>>> person.age = 4

>>> person().age

4>>> p = person()

>>> person.age = 31

>>> p.age

31對類屬性的修改,反映到了先前生成的物件的屬性上,這說明類屬性和物件的屬性共享乙個值;

複製** **如下:

>>> p.age = 34

>>> p.age

34>>> person.age

31>>> person.age = 99

>>> p.age

34而一旦對物件的屬性的修改,物件屬性就擁有了自己的值,並不會反映到類屬性上,而對類屬性的修改,也不再反映到該物件的屬性上;

這種行為與j**ascript類似

本文標題: python中的類學習筆記

本文位址: /jiaoben/python/114081.html

python學習筆記 類

brad turtle.turtle 使用這條命令時,是指在turtle這個檔案裡有乙個類 turtle。在呼叫這條命令時,其實是呼叫裡邊的 init 函式。init函式的作用是在記憶體中分配空間來建立具體的物件。client rest.twiliorestclient 使用這條命令時,是指在res...

python學習筆記 類

class dog def init self,name,age 可以視self為乙個框架,name和age為該框架下的屬性 init 是乙個特殊的方法,每當你建立乙個dog類的例項時都會自動執行該方法 self.name name self.age age def sit self print s...

python 學習筆記 類

8.10 python 學習筆記 類的學習 建立檔案 class dog definit self,name,age self.name name self.age age 類中的函式稱為方法,init是乙個特殊方法,開頭和結尾都有下劃線 賦值姓名和年齡 def sit self print sel...