Python中的類學習筆記_python

來源:互聯網
上載者:User

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

定義一個Person類:

複製代碼 代碼如下:

>>> class Person:
... def sayHello(self):
... print('hello')
...
>>> Person.sayHello(None)
hello
>>> Person().sayHello()
hello
 
可以修改Person的類方法
複製代碼 代碼如下:

>>> def hack_sayHello(obj):
... print('...hello')
...
>>>
>>> Person.sayHello = 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 "<stdin>", line 1, in <module>
File "<stdin>", line 4, in sayHello
NameError: name 'name' is not defined
>>> p = Person()
>>> p.name = 'wyj'
>>> p.sayHello()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", 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 "<stdin>", line 1, in <module>
File "<stdin>", 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的類機制類似Javascript);

存取控制

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 "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute '__private_method'
 
實際上,以上底線打頭的方法都有一個_ClassName__methodName的方法
複製代碼 代碼如下:

>>> Person._Person__private_method
<function Person.__private_method at 0x7fed431a2d90>
 
調用
複製代碼 代碼如下:

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

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

這種行為與Javascript類似

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.