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

本贴最后更新于 3900 天前,其中的信息可能已经天翻地覆

题外话:关于缩进

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

注:前面四部分,都是我参看《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面向对象的一些语法知识。

1、pass关键字

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

2、缩进

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

3、继承

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

4、再说__init__方法

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

5、参数

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

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

6、self

self相当于c++或者java中的this,但是他并不是一个保留字,它只是一个命名习惯。所以请一定坚持这个习惯。

7、何时使用self和__init__

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

注:__init__方法是可选的,但是一旦定义了之后,就必须要显示调用父类的__init__方法(如果它定义了的话)这样才是正确的:无论何时子类想要扩展父类的行为,后代方法必须在适当的时机,使用适当的参数,显示调用父类方法。

8、类的实例

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

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

9、参数的重载

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

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

-----未完-----

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖 • 1 关注
  • 面向对象
    13 引用 • 28 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone

    用 Sublime_Text2 写 python 吧······我一直用···很漂亮,但是不仅仅是漂亮

  • someone

    等你用 pycharm,才知道是神器很好用的。。做比较大的应用这个很适合。我反正比较喜欢哈。。。