python学习---面向对象的编程续一(五)

题外话:关于缩进

    python关于缩进,对于新手,或者学过其余语言,而后再学习python对于格式可能有些不习惯。同时也没有{},刚开始我也为这种格式蛋疼了一会,因为缩进有问题,连编译都编译不了。可是若是你选择了一款正确的编辑器,而后再严格按照这种风格去编码,你会发现你的python代码是如此的漂亮。在这里我推荐pycharm ,关于注册什么的,本身能够在网上搜搜注册码,这是一款我认为比较好用的编辑器。但愿你也能喜欢。java

注:前面四部分,都是我参看《python简明教程》 很容易理解,因此就将其中的一些比较重要的概念罗列了出来,接下来的小节,将会加入本身的理解,而且逐步深刻,请各位网友多加指点python

python的面向对象深刻

#-*- coding:utf-8 -*-

__author__ = 'oldcaptain.cc'

class SchoolMember:

'''表明任何学校成员'''

def __init__(self,name,age):

self.name = name

self.age = age

print '初始化的成员: %s' % self.name

def tell(self):

'''说话细节'''

print '名称:"%s" age : "%s"'%(self.name,self.age)

class Teacher(SchoolMember):

'''表明一个老师'''

def __init__(self,name,age,salary):

SchoolMember.__init__(self,name,age)

self.salary = salary

print '初始化的老师有 : %s' %self.name

def tell(self):

SchoolMember.tell(self)

print '科目 : "%d" ' % self.salary

class Student(SchoolMember):

def __init__(self,name,age,marks):

SchoolMember.__init__(self,name,age)

self.marks = marks

print '初始化的学生为 : %s' %self.name

def tell(self):

SchoolMember.tell(self)

print 'marks : "%d"' %self.marks

t = Teacher("oldcaptain",40,30000)

s = Student("guopeng",22,75)

上面这段代码是一段关于继承的实现,表现出了多态,而且展示出了一些关于python面向对象的一些语法知识。c++

一、pass关键字

当这个类中没有没有定义任何关键字或者方法的时候,可使用关键字pass,至关于java中的{}什么也没有,一个空的类。sql

二、缩进

在类中的全部东西都缩进,if,函数,for,等等,当不缩进的代码则被认为不属于这个类。编辑器

三、继承

在python中,类的基类只是简单的列在类名后面的小括号中,若是你想要多重继承,那么就在类名后面的小括号中列出你要继承的类名,而且以逗号进行分割。在java中,父类的方法在子类方法执行前被自动调用,python不是这样,你必须显示的调用父类中的合适方法。函数

四、再说__init__方法

__init__在类的实例被建立后被当即调用。他可能会让你误解为构造函数。由于他看上去像(在类中,习惯被第一个定义的方法)行为也像(在一个新建立的实例中,它是第一个被调用的方法),说它不正确时由于对象再调用init方法时,已经被构造出来了,你已经有了 一个对类的的新实例的有效引用。可是__init__是在python中你能够获得最接近构造函数的东西。而且他也扮演者很是类似的角色。学习

五、参数

每一个类的方法的第一个参数,包括__init__,都是指向类当前的实例的引用。按照习惯这个参数老是被称为self。在__init__方法中,self指向新建立的对象;在其余的类方法中,它指向方法被调用的类实例。尽管当定义方法时你须要明确指定self,但在调用方法时,你不能指定他,python会给你自动加上的。测试

__init__方法能够接受任意数目的参数,就像函数同样,参数能够用缺省值定义,便可以设置成对于调用者可选。this

六、self

self至关于c++或者java中的this,可是他并非一个保留字,它只是一个命名习惯。因此请必定坚持这个习惯。google

七、什么时候使用self和__init__

当你定义本身的类方法时,你必须明确的将self做为每一个方法的第一个参数列出,包括__init__ ,当你从类中调用一个父类的方法时,你必须包括self参数,但当你从类的外部调用你的类方法时,你没必要对self参数指定任何值;你彻底将其忽略,而python会自动替你增长实例的引用。刚开始这里可能不是很好理解。因此须要慢慢在代码中理解这些特性。

注:__init__方法是可选的,可是一旦定义了以后,就必需要显示调用父类的__init__方法(若是它定义了的话)这样才是正确的:不管什么时候子类想要扩展父类的行为,后代方法必须在适当的时机,使用适当的参数,显示调用父类方法。

八、类的实例

每个类的实例有一个内置属性,_class_,它是对象的类。(注意这个表示,在内存中的地址,通过我本身测试,这里并非物理地址。)

在python中,每个对象都有本身的元数据属性,包括__class__,__dict__,__module__等.

九、参数的重载

在java中支持经过参数列表的重载,也就是一个类能够同名的方法,但这些方法或者是参数个数不一样,或者参数的类型不一样,像plsql支持参数名的重载。在python中两种都不支持,总之没有任何形式的函数重载。一个__init__方法就是一个__init__方法,无论什么样的参数,一个类中只能有一个__init__方法,而且若是一个子类拥有一个__init__方法,他老是覆盖父类的__init__方法,甚至子类能够用不一样的参数列表来定义它。

python做者解释 :方法的覆盖 : 子类能够覆盖父类中的方法。由于方法没有特殊的优先的设置,父类中的一个方法在调用同类中的另外一个方法时,可能调用到的是子类中覆盖的覆盖的父类的同名方法的方法。

相关文章
相关标签/搜索