Python基础09 面向对象的进一步拓展

来源:互联网 发布:日志系统数据库设计 编辑:程序博客网 时间:2024/05/11 13:34

作者:Vamei 出处:http://www.cnblogs.com/vamei  

上一讲我们熟悉了对象和类的基本概念。这一讲我们将进一步拓展,以便我们真正能实际运用对象和类。


1. 在方法内调用类属性(变量以及其它方法):

上一讲我们已经提到,在定义方法时,必须有self这一参数,这个参数指的是对象。由于对象拥有类的所有性质,那么我们就可以在方法内部通过self来调用类的其它属性

复制代码
class Human(object):    laugh = 'hahahaha'    def show_laugh(self):        print self.laugh    def laugh_100th(self):        for i in range(100):            self.show_laugh()li_lei = Human()              # 李雷li_lei.laugh_100th()
复制代码

我们这里有一个变量属性laugh,在方法show_laugh()中通过self.laugh使用该属性的值。方法show_laugh则在laugh_100th中通过self.show_laugh()被调用。

(在方法中更改类变量属性的值是危险的,这样会影响根据这个类定义的所有对象的这一属性!!)

 

2. __init__()方法

__init__()是一个特殊方法(special method)。Python里会有一些特殊方法,Python会以特别的方式处理它们。特殊方法的名字的特点是前后都有两个下划线

__init__()方法的特殊在于,如果你在类中定义了这个方法,一旦你根据这个类建立对象,Python就会自动调用这个方法(这个过程也叫初始化)。(在上一讲中,我们手动调用了move()方法)

class happyBird(Bird):    def __init__(self,more_words):        print 'We are happy birds.',more_wordssummer = happyBird('Happy,Happy!')

(Bird类的定义见上一讲)

屏幕上打印出:

We are happy birds.Happy,Happy!

我们看到,尽管我们只是创建了summer对象,但__init__()方法被自动调用了。最后一行的语句(summer = happyBird...)先创建了对象,然后执行:

summer.__init__(more_words)

'Happy,Happy!' 被传递给了__init__()的参数more_words

 

3. 对象的性质

上一讲我们讲了变量属性和方法属性。要注意,这些属性是类的属性。所有属于一个类的对象都会共享这些属性。比如说,鸟都有羽毛,鸡都不会飞。

在一些情况下,我们需要用到对象的性质。比如说,人是一个类别,我们知道,性别是人类的一个性质,但并不是所有的人类都是男性或者所有的人类都是女性。这个性质的值会随着对象的不同而不同。(李雷是人类的一个对象,性别是男;韩美美也是人类的一个对象,性别是女)。

从上一讲中,我们已经知道了,当定义类的方法时,必须要传递一个self的参数。这个参数指代的就是类的一个对象。当然,这是一个很模糊的一个概念。但一旦我们用类来新建一个对象(比如说我们下面例子中的li_lei), 那么li_lei就是self所代表的东西。我们已经知道了,li_lei会拥有Human类的属性。进一步,我们通过赋值给self.attribute,给li_lei这一对象增加一些性质(比如说性别)。由于self强制传递给各个方法,方法可以通过引用self.attribute很方便地查询到这些性质,并进行进一步的操作。

这样,我们在类的属性统一的基础上,又给每个对象增添了各自特色的性质,从而能描述多样的世界。

复制代码
class Human(object):    def __init__(self, input_gender):        self.gender = input_gender    def printGender(self):        print self.genderli_lei = Human('male') # 这里,'male'作为参数传递给__init__()方法的input_gender变量。print li_lei.genderli_lei.printGender()
复制代码

首先,在初始化中,将参数input_gender赋值给对象li_lei的性质gender。(上一讲,我们已经提到,self指示的是对象, 也就是li_lei)

我们发现,li_lei拥有了属性gender。在类human的定义中,并没有这样一个变量属性。Python是在建立了li_lei这一对象之后,专门为li_lei建立的属性。我们称此为对象的性质。(也有人以类属性,对象属性来区分)。

对象的性质也可以被其它方法调用,正如我们在printGender方法中所看到的那样。

 

总结:

通过self调用类属性

__init__(): 在建立对象时自动执行

类属性和对象的性质的区别

原创粉丝点击