Python类与面向对象编程

  

1。类语句

  

类通常是由函数,变量和属性组成的集合。使语用类句可以定义类,例如:

  
 <代码>类账户(对象):
  num_accounts=0
  def __init__(自我、名称、平衡):
  self.name=名字
  自我。平衡=平衡
  帐户。num_accounts +=1
  def __del__(自我):
  帐户。num_accounts -=1
  def存款(自我,amt):
  自我。=自我平衡。平衡+ amt
  def撤回(自我,amt):
  自我。=自我平衡。平衡——amt
  def调查(自我):
  返回self.balance  
  

在类主体执行期间创建的值放在类对象中,这个对象充当着命名空间,例如:

  
 <代码> Account.num_accunts
  Account.__init__
  Account.__del__
  Account.deposit
  Account.withdraw
  Account.inquiry  
  

需要注意的是,类语句本身并不创建该类的任何类型。类仅设置将在以后创建的所有实例都使用的属性。类中定义的函数称为实例方法。类的实例作为第一个参数传递,根据约定,这个参数称为自我,但所有合法的标识符都可以使用。类变量是可在类的所有实例之间共享的值。比如上例的num_accounts变量用于跟踪存在多少个帐实例。

  

2。类实例

  

类的实例是以函数形式调用类对象来创建的。这种方法将创建一个新实例,而后将该实例传递给类的__init__()方法. __init__()方法的参数包括新创建的实例自我和在调用类对象时提供的参数例。如:

  
 <代码>=账户(“圭多”,1000.00)
  b=账户(“比尔”,10.00) 
  

通过将属性分配给自我来将其保存到实例中,例如self.name=名字表示将名字属性保存在衫例中。使用“!”运算符可以访问这些属性以及类属性,例如:

  
 <代码> a.deposit (100.00)
  b.withdraw (50.00)
  name=a.name  
  

尽管类会定义命名空间,但它们不会为在方法体内使用的名称限定范围,所以在实现类时,对属性和方法的引用必须是完全限定的。比如之前的例子中使用的是self.balance而非平衡。如果希望从一个方法中调用另一个方法,也可以采用这种方式,例如:

  
 <代码>类Foo(对象):
  def酒吧(自我):
  打印(“酒吧!”)
  def垃圾邮件(自我):
  栏(自我)#错误,抛出NameError异常
  self.bar ()
  Foo.bar(自我) 
  

  

3。继承

  

继承是一种创建新类的机制。原始类称为基类或超类。新类称为派生类或子类。通过继承创建类时,所创建的类将“继承”其基类定义的属性。派生类可以重新定义属性并添加自己的属性。
类语在句中使用以逗号分隔的基类名称列表来指定继承。如果没有有效的基类,将继承对象。继承通常会重新定义现有方法的行为,例如:

  
 <代码>进口随机的
  类EvilAccount(帐户):
  def调查(自我):
  如果andom。randint (0, 4)==1:
  回归自我。平衡* 1.10
  其他:
  返回self.balance
  c=EvilAccount(“乔治”,1000.00)
  c.deposit (10.0)
  可用=c.inquiry()  
  

如果搜索一个属性时未在实例或实例的类中找到匹配项,搜索将会在基类上进行。这个过程会一直继续下去,直到没有更多的基类可供搜索。子类可以定义自己的__init__()方法,因此,要由派生类调用基类的__init__()方法来对它们进行恰当的初始化。如果基类未定义__init__(),就可以忽略这一步。如果不知道基类是否定义了__init__(),可在不提供任何参数的情况下调用它,因为始终存在一个不执行任何操作的默认__init__()实现,例如:

  
 <代码>类EvilAccount(帐户):
  def __init__(自我、名称、平衡、evilfactor):
  帐户。__init__(自我、名称、平衡)
  自我。evilfactor=evilfactor
  def调查(自我):
  如果随机的。randint (0, 4)==1:
  回归自我。平衡* self.evilfactor
  其他:
  返回self.balance  
  

有时,派生类重新实现了方法,但是还想调用原始的实现,可以将实例自我作为第一个参数传递,例如:

  
 <代码>类MoreEvilAccount (EvilAccount):
  def存款(自我、数量):
  self.withdraw (5.00)
  EvilAccount.deposit(自我、数量) 
  

但是这种写法容易引起一些混淆,可以使用另一种方案,用超级()函数,例如:

  
 <代码>类MoreEvilAccount (EvilAccount):
  def存款(自我、数量):
  self.withdraw (5.00)
  super () .deposit(数量) 
  

Python支持多重继承,通过让一个类列出多个基类即可指定多重继承,例如:

Python类与面向对象编程