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...