Object Oriented Programming

类定义

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__方法也是方法写。

多态

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

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

你可能感兴趣的:(Object Oriented Programming)