类class第二讲
上一讲我们熟悉了对象和类的基本概念。这一讲我们将进一步拓展,以便我们真正能实际运用对象和类。
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_words
summer = happyBird('Happy,Happy!')
(Bird类的定义见上一讲)
屏幕上打印出: We are happy birds.Happy,Happy!
我们看到,尽管我们只是建立了summer对象,但__init__()方法被自动调用了。最后一行上先建立了对象,然后执行:
summer.__init__(more_words)
'Happy,Happy!' 被传递给了__init__()的参数more_words
3. 对象的性质
上一讲我们讲了变量属性和方法属性。要注意,这些属性是类的属性。所有属于一个类的对象都会共享这些属性。比如说,鸟都有羽毛,鸡都不会飞。
在一些情况下,我们需要用到对象的性质。比如说,人是一个类别,我们知道,性别是人类的一个性质,但并不是所有的人类都是男性或者所有的人类都是女性。这个性质的值会随着对象的不同而不同。(李雷是人类的一个对象,性别是男;韩美美也是人类的一个对象,性别是女)。
我们一般通过self.attribute的方法,来说明某个量是依赖于对象的性质。
class Human(object):
def __init__(self, input_gender):
self.gender = input_gender
def printGender(self):
print self.gender
li_lei = Human('male')
print li_lei.gender
li_lei.printGender()
屏幕上打印出:
male
male
首先,在初始化中,将参数input_gender赋值给对象li_lei的性质gender。(上一讲,我们已经提到,self指示的是对象, 也就是li_lei)
我们发现,li_lei拥有了属性gender。在类human的定义中,并没有这样一个变量属性。Python是在建立了li_lei这一对象之后,专门为li_lei建立的属性。我们称此为对象的性质。(也有人以类属性,对象属性来区分)。
对象的性质也可以被其它方法调用,正如我们在printGender方法中所看到的那样。
总结:
通过self调用类属性
__init__(): 在建立对象时自动执行
类属性和对象的性质的区别