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支持多重继承,通过让一个类列出多个基类即可指定多重继承,例如: