Object Oriented Programming

2018-12-03  本文已影响0人  碎乌拉_7b63

类定义

class ClassName(BaseClassName):
  <statement 1>
  `
  `
  `
  <statement n>
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方法接受的任何参数。

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)

重写方法

可以随时重写父类的方法。 重写父方法的一个原因是:您可能希望在子类中使用特殊或不同的方法功能。

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

多态

多态存在的三个必要条件:

  1. 继承
  2. 重写
  3. 父类引用指向子类对象(在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()总是先查找它自身的定义,如果没有定义,则顺着继承链向上查找,直到在某个父类中找到为止。
简而言之,就是对父类方法的重写并由此在子类中表现出所期望的形式。

上一篇 下一篇

猜你喜欢

热点阅读