1. 程式人生 > 程式設計 >python程式設計進階之類和物件用法例項分析

python程式設計進階之類和物件用法例項分析

本文例項講述了python類和物件用法。分享給大家供大家參考,具體如下:

前面我們都是用python面向過程程式設計,現在來用python建立類和物件,面向物件程式設計。類和物件是面向物件程式設計的兩個主要方面。類建立一個新型別,而物件這個類的 例項 。這類似於你有一個int型別的變數,這儲存整數的變數是int類的例項(物件)。在python中,類和例項中的變數稱為域,類和例項中的函式稱為方法,域和方法都是類和例項的屬性

類的定義

在定義類或者它的函式的時候,如果沒有引數的話,需要把引數寫為self,這樣在外部呼叫的時候能清楚呼叫的是哪個例項的函式。這個self表示的是當前的例項,與C++中的self和Java中的this是一樣的。

空類

#!/usr/bin/python
# Filename: simplestclass.py
class Person:
  pass # An empty block
p = Person()
print p

我們使用class語句後跟類名,建立了一個新的類。這後面跟著一個縮排的語句塊形成類體。在這個例子中,我們使用了一個空白塊,它由pass語句表示。這樣編譯的時候就會跳過。這是一個空類。

接下來,我們使用類名後跟一對圓括號來建立一個物件/例項。因為這個類不需要任何的引數,所以建立的時候也不需要引數。

$ python simplestclass.py
<__main__.Person instance at 0xf6fcb18c>

列印這個物件,我們可以看到這個物件所屬的類,以及它的記憶體地址。

__init__函式

在上面的例子中,我們沒有寫任何東西,但是還是會有一個預設的建構函式。在python中也有類似建構函式的東西,就是__init__函式。在建立物件的時候會自動呼叫這個函式。

#!/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引數,所以需要提供一個引數。可以看到這個類中有一個自己的域,在構造的時候把name的值賦給物件裡的name。
可以看到,sayHi並不需要引數,但是在定義函式時仍然要有引數self

__del__函式

就如同init方法一樣,還有一個特殊的方法del,它在物件消逝的時候被呼叫。相當於解構函式。物件消逝即物件不再被使用,它所佔用的記憶體將返回給系統作它用。但是很難保證這個方法究竟在什麼時候執行。如果你想要指明它的執行,你就得使用del語句。程式碼例子和下面的在一起。

使用類的變數

Python中所有的類成員(包括資料成員)都是公共的,所有的方法都是有效的 。

只有一個例外:如果你使用的資料成員名稱以雙下劃線字首比如__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賦值)因此是物件的變數。

觀察可以發現init方法用一個名字來初始化Person例項。在這個方法中,我們讓population增加1,這是因為我們增加了一個人。同樣可以發現,self.name的值根據每個物件指定,這表明了它作為物件的變數的本質。

記住,你只能使用self變數來引用同一個物件的變數和方法。這被稱為 屬性引用。

當一個物件被清除的時候,del被呼叫,人數減少1並輸出誰走了。一開始Abdul Kalam被自動清除了,後來Swaroop也被自動清除了。清除的順序應該跟物件閒置的時間有關,當閒置時間達到某個值就清除掉。

繼承

python的繼承和C++還有JAVA沒有什麼不同,就是建構函式和其他函式裡記得要在引數里加上self。函式的過載也是和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,age,salary):
    SchoolMember.__init__(self,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,marks):
    SchoolMember.__init__(self,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是父類,學生和老師是子類,繼承的方法為在類定義中把引數設為schoolmenber。可以看到,當我們繼承一個類的時候,首先呼叫的是父類的建構函式,然後才是子類的。

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python面向物件程式設計入門與進階教程》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》

希望本文所述對大家Python程式設計有所幫助。