類定義
class ClassName(BaseClassName):
<statement 1>
`
`
`
<statement n>
- ClassName是類名肢娘。遵循大駝峰原則呈础。
- BaseClassName是父類的類名,無特殊父類為object橱健。
示例
class BankAccount (object) :
def __init__(self, name) :
self.owner = name
self.balance = 0
def add (self , amount ) :
self.balance += amount
def display(self) :
print(self.owner, self.alance)
- 第一個方法
__init __()
是一種特殊的方法而钞,稱為Python構造函數。 - 聲明其他類方法拘荡,如正常函數臼节,每個方法的第一個參數是
self
。 Python將self
參數添加到列表中; 調用方法時不需要包含它珊皿。
創(chuàng)建實例對象
要創(chuàng)建類的實例网缝,可以使用類名調用該類,并傳遞其init方法接受的任何參數蟋定。
b = BankAccount ( "Bart " )
b.add(100)
b.display( )
私有屬性
def __init__(self, name) :
self._owner = name
self._balance = 0
下劃線用于表示將變量保持為private
粉臊,所以最好不要在class外使用它。
類的繼承
面向對象的編程帶來的主要好處之一是代碼的重用驶兜,實現這種重用的方法之一是通過繼承機制扼仲。
通過繼承創(chuàng)建的新類稱為子類或派生類远寸,被繼承的類稱為基類、父類或超類屠凶。
class BankAccount(object):
def __init__(self, name, pwd):
self._owner = name
self._pwd = pwd
self._balance = 0
def _authenticate(self,pwd):
return self._pwd == pwd
def add(self, amount, pwd):
if self._authenticate(pwd):
self._balance += amount
else:
print("error!")
def __str__(self):
return '%s: %i' % (self._owner, self._balance)
class GroupAccount(BankAccount):
def __init__(self, name, pwd):
super().__init__(name, pwd)
self._holders = []
self._pwds = []
def addHoler(self, holder, pwd):
self._holders.append(holder)
self._pwds.append(pwd)
def _authenticate(self,pwd):
return pwd in self._pwds
a = BankAccount("bart", 111)
b = GroupAccount('Max', 222)
b.addHoler('john', 333)
b.addHoler('Tim', 444)
b . add (100 ,333)
b . add (100 ,123)
print(b)
-
super()
代表父類驰后。super()__init__()
表示用父類的構造方法構造子類的屬性。 - 當使用print輸出對象的時候矗愧,只要自己定義了
__str__(self)
方法灶芝,那么就會打印從在這個方法中return的數據。
重寫方法
方法重載是指同一個類中的多個方法具有相同的名字,但這些方法具有不同的參數列表,即參數的數量或參數類型不能完全相同
方法重寫是存在子父類之間的,子類定義的方法與父類中的方法具有相同的方法名字,相同的參數表和相同的返回類型
可以隨時重寫父類的方法唉韭。 重寫父方法的一個原因是:您可能希望在子類中使用特殊或不同的方法功能监署。
class Parent: # define parent class
def myMethod(self):
print ('Calling parent method')
class Child(Parent): # define child class
def myMethod(self):
print ('Calling child method')
c = Child() # instance of child
c.myMethod() # child calls overridden method
- 子類的
__init__
,__str__
方法也是方法寫纽哥。
多態(tài)
多態(tài)存在的三個必要條件:
- 繼承
- 重寫
- 父類引用指向子類對象(在java中
Person p = new Student();
)
示例
class Person(object):#define Person class
def __init__(self, name, gender):
self.name = name
self.gender = gender
def whoAmI(self):
return 'I am a Person, my name is %s' % self.name
class Student(Person): #define Student class
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
def whoAmI(self):
return 'I am a Student, my name is %s' % self.name
class Teacher(Person): #define Teacher class
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
def whoAmI(self):
return 'I am a Teacher, my name is %s' % self.name
def who_am_i(x): #接收變量 x栖秕,則無論該 x 是 Person春塌、Student、Teacher簇捍,打印出結果:
print(x.whoAmI())
p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')
who_am_i(p)
who_am_i(s)
who_am_i(t)
運行結果:
I am a Person, my name is Tim
I am a Student, my name is Bob
I am a Teacher, my name is Alice
這種行為稱為多態(tài)只壳。也就是說,方法調用將作用在 x 的實際類型上暑塑。s 是Student類型吼句,它實際上擁有自己的 whoAmI()方法以及從 Person繼承的 whoAmI方法,但調用 s.whoAmI()總是先查找它自身的定義事格,如果沒有定義惕艳,則順著繼承鏈向上查找,直到在某個父類中找到為止驹愚。
簡而言之,就是對父類方法的重寫并由此在子類中表現出所期望的形式远搪。