python編程進階之類和對象用法實例分析
本文實例講述了python類和對象用法。分享給大家供大家參考,具體如下:
前面我們都是用python面向過程編程,現(xiàn)在來用python創(chuàng)建類和對象,面向對象編程。類和對象是面向對象編程的兩個主要方面。類創(chuàng)建一個新類型,而對象這個類的 實例 。這類似于你有一個int類型的變量,這存儲整數(shù)的變量是int類的實例(對象)。在python中,類和實例中的變量稱為域,類和實例中的函數(shù)稱為方法,域和方法都是類和實例的屬性。
類的定義
在定義類或者它的函數(shù)的時候,如果沒有參數(shù)的話,需要把參數(shù)寫為self,這樣在外部調用的時候能清楚調用的是哪個實例的函數(shù)。這個self表示的是當前的實例,與C++中的self和Java中的this是一樣的。
空類
#!/usr/bin/python # Filename: simplestclass.py class Person: pass # An empty block p = Person() print p
我們使用class語句后跟類名,創(chuàng)建了一個新的類。這后面跟著一個縮進的語句塊形成類體。在這個例子中,我們使用了一個空白塊,它由pass語句表示。這樣編譯的時候就會跳過。這是一個空類。
接下來,我們使用類名后跟一對圓括號來創(chuàng)建一個對象/實例。因為這個類不需要任何的參數(shù),所以創(chuàng)建的時候也不需要參數(shù)。
$ python simplestclass.py
<__main__.Person instance at 0xf6fcb18c>
打印這個對象,我們可以看到這個對象所屬的類,以及它的內存地址。
__init__函數(shù)
在上面的例子中,我們沒有寫任何東西,但是還是會有一個默認的構造函數(shù)。在python中也有類似構造函數(shù)的東西,就是__init__函數(shù)。在創(chuàng)建對象的時候會自動調用這個函數(shù)。
#!/usr/bin/python # Filename: class_init.py class Person: def __init__(self, name): self.name = name def sayHi(self): print 'Hello, my name is', self.name p = Person('Swaroop') p.sayHi()
輸出:
$ python class_init.py
Hello, my name is Swaroop
當新建一個person對象時,因為__init__中需要有name參數(shù),所以需要提供一個參數(shù)。可以看到這個類中有一個自己的域,在構造的時候把name的值賦給對象里的name。
可以看到,sayHi并不需要參數(shù),但是在定義函數(shù)時仍然要有參數(shù)self。
__del__函數(shù)
就如同init方法一樣,還有一個特殊的方法del,它在對象消逝的時候被調用。相當于析構函數(shù)。對象消逝即對象不再被使用,它所占用的內存將返回給系統(tǒng)作它用。但是很難保證這個方法究竟在什么時候運行。如果你想要指明它的運行,你就得使用del語句。代碼例子和下面的在一起。
使用類的變量
Python中所有的類成員(包括數(shù)據(jù)成員)都是公共的,所有的方法都是有效的 。
只有一個例外:如果你使用的數(shù)據(jù)成員名稱以雙下劃線前綴比如__privatevar,Python的名稱管理體系會有效地把它作為私有變量。
這樣就有一個慣例,如果某個變量只想在類或對象中使用,就應該以單下劃線前綴。而其他的名稱都將作為公共的,可以被其他類/對象使用。
#!/usr/bin/python # Filename: objvar.py class Person: '''Represents a person.''' population = 0 def __init__(self, name): '''Initializes the person's data.''' self.name = name print '(Initializing %s)' % self.name # When this person is created, he/she # adds to the population Person.population += 1 def __del__(self): '''I am dying.''' print '%s says bye.' % self.name Person.population -= 1 if Person.population == 0: print 'I am the last one.' else: print 'There are still %d people left.' % Person.population def sayHi(self): '''Greeting by the person. Really, that's all it does.''' print 'Hi, my name is %s.' % self.name def howMany(self): '''Prints the current population.''' if Person.population == 1: print 'There is nobody here.' else: print 'We have %d persons here.' % Person.population swaroop = Person('Swaroop') swaroop.sayHi() swaroop.howMany() kalam = Person('Abdul Kalam') kalam.sayHi() kalam.howMany() swaroop.sayHi() swaroop.howMany()
輸出:
$ python objvar.py
(Initializing Swaroop)
Hi, my name is Swaroop.
I am the only person here.
(Initializing Abdul Kalam)
Hi, my name is Abdul Kalam.
We have 2 persons here.
Hi, my name is Swaroop.
We have 2 persons here.
Abdul Kalam says bye.
There are still 1 people left.
Swaroop says bye.
There is nobody here.
這是一個很長的例子。這里,population屬于Person類,因此是一個類的變量。name變量屬于對象(它使用self賦值)因此是對象的變量。
觀察可以發(fā)現(xiàn)init方法用一個名字來初始化Person實例。在這個方法中,我們讓population增加1,這是因為我們增加了一個人。同樣可以發(fā)現(xiàn),self.name的值根據(jù)每個對象指定,這表明了它作為對象的變量的本質。
記住,你只能使用self變量來引用同一個對象的變量和方法。這被稱為 屬性引用。
當一個對象被清除的時候,del被調用,人數(shù)減少1并輸出誰走了。一開始Abdul Kalam被自動清除了,后來Swaroop也被自動清除了。清除的順序應該跟對象閑置的時間有關,當閑置時間達到某個值就清除掉。
繼承
python的繼承和C++還有JAVA沒有什么不同,就是構造函數(shù)和其他函數(shù)里記得要在參數(shù)里加上self。函數(shù)的重載也是和C++,JAVA一樣的。
例子:
#!/usr/bin/python # Filename: inherit.py class SchoolMember: '''Represents any school member.''' def __init__(self, name, age): self.name = name self.age = age print '(Initialized SchoolMember: %s)' % self.name def tell(self): '''Tell my details.''' print 'Name:"%s" Age:"%s"' % (self.name, self.age), class Teacher(SchoolMember): '''Represents a teacher.''' def __init__(self, name, age, salary): SchoolMember.__init__(self, name, age) self.salary = salary print '(Initialized Teacher: %s)' % self.name def tell(self): SchoolMember.tell(self) print 'Salary: "%d"' % self.salary class Student(SchoolMember): '''Represents a student.''' def __init__(self, name, age, marks): SchoolMember.__init__(self, name, age) self.marks = marks print '(Initialized Student: %s)' % self.name def tell(self): SchoolMember.tell(self) print 'Marks: "%d"' % self.marks t = Teacher('Mrs. Shrividya', 40, 30000) s = Student('Swaroop', 22, 75) print # prints a blank line members = [t, s] for member in members: member.tell() # works for both Teachers and Students
輸出:
$ python inherit.py
(Initialized SchoolMember: Mrs. Shrividya)
(Initialized Teacher: Mrs. Shrividya)
(Initialized SchoolMember: Swaroop)
(Initialized Student: Swaroop)Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
Name:"Swaroop" Age:"22" Marks: "75"
schoolmenber是父類,學生和老師是子類,繼承的方法為在類定義中把參數(shù)設為schoolmenber。可以看到,當我們繼承一個類的時候,首先調用的是父類的構造函數(shù),然后才是子類的。
更多關于Python相關內容感興趣的讀者可查看本站專題:《Python面向對象程序設計入門與進階教程》、《Python數(shù)據(jù)結構與算法教程》、《Python函數(shù)使用技巧總結》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》
希望本文所述對大家Python程序設計有所幫助。
- python drf各類組件的用法和作用
- python定義類的簡單用法
- python db類用法說明
- Python面向對象程序設計之靜態(tài)方法、類方法、屬性方法原理與用法分析
- Python面向對象程序設計之類和對象、實例變量、類變量用法分析
- Python面向對象中類(class)的簡單理解與用法分析
- Python3變量與基本數(shù)據(jù)類型用法實例分析
- Python 面向對象之類class和對象基本用法示例
- python定義類self用法實例解析
- Python中類似于jquery的pyquery庫用法分析
- Python上下文管理器類和上下文管理器裝飾器contextmanager用法實例分析
- 詳細介紹python類及類的用法
相關文章
sklearn中的交叉驗證的實現(xiàn)(Cross-Validation)
這篇文章主要介紹了sklearn中的交叉驗證的實現(xiàn)(Cross-Validation),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02