类定义
class ClassName(BaseClassName):
`
`
`
- 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
参数添加到列表中; 调用方法时不需要包含它。
创建实例对象
要创建类的实例,可以使用类名调用该类,并传递其init方法接受的任何参数。
b = BankAccount ( "Bart " )
b.add(100)
b.display( )
私有属性
def __init__(self, name) :
self._owner = name
self._balance = 0
下划线用于表示将变量保持为private
,所以最好不要在class外使用它。
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
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__
方法也是方法写。
多态
多态存在的三个必要条件:
- 继承
- 重写
- 父类引用指向子类对象(在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
这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。s 是Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的 whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
简而言之,就是对父类方法的重写并由此在子类中表现出所期望的形式。