作为一个面向对象的语言,类是少不了的。同时连带着的还有继承、多态、封装。
首先看一下类的定义:
class newClass(object):
def __init__(self):
print 'class init'
class:如同def一样,标记这是一个class
newClass:类名
object:这个是你的超类,可能在别的语言里叫父类,object是所有类的超类
在创建这个类的同时呢,我们还创建了一个方法
什么是方法呢
仔细看init这个方法 ,这不就是函数嘛,其实跟函数区别不大,最大的区别就是,方法的第一个参数一定是self,不写会报错的。
说完创建再来看看使用:
newC = newClass()
#打印
class init
发生了什么,为什么我创建的时候会打印了一句class init,原因在于,当你创建init这个方法的时候,在对象创建时就会自动执行这个方法,于是,打印出来class init这句话。其实在newClass()的括号中是可以传值的,但是由于我们的init方法并没有参数,所以我们就不需要传了。
需要传值的情况:
class newClass(object):
def __init__(self,name):
self.name = name
print self.name
#如果不传入name,会报错提醒你少穿一个参数
newC = newClass()
TypeError: __init__() takes exactly 2 arguments (1 given)
#正确
newC = newClass('1Ran')
#打印
1Ran
你会发现self.name,这个name是什么呢,name其实是类的属性,由于python是动态语言,所以当你有需要添加属性的时候,可以直接使用即可。
我们可以用dir(newC)来查看newC中有的所有属性,当然你同时会看到init也在里面,毕竟方法也是一种变量嘛。
说到属性,又需要说说属性的一些特点:
1.属性
属性就是最普通的,如
class newClass(object):
def __init__(self,name):
self.name = name
print self.name
#name就是一个属性,你可以在外面访问
newC = newClass('1Ran')
1Ran
newC.name
1Ran
newC.name = 'love 1Ran'
newC.name
love 1Ran
#用实例变量是可以修改的
2.私有属性
#私有属性是以__或_开头的属性
如:
class newClass(object):
def __init__(self,name):
self.name = name
print self.name
__age = 18
这里的__age就是一个私有属性,怎样验证呢,使用一下就知道了
使用:
newC = newClass('1Ran')
newC.__age
#直接报错,说找不到age这个属性
AttributeError: 'newClass' object has no attribute 'age'
为什么呢,因为被隐藏了。取不到值我们来赋值试一下。
newC.__age = 20
成功了,什么情况,不是被隐藏了嘛,为什么还能修改成功。因为python是动态语言,在你给newC实例赋值时相当于给这个实例绑定了一个__age变量
让我们看看下面这种情况
class newClass(object):
def __init__(self,name):
self.name = name
print self.name
__age = 18
#在方法中返回,虽然__age被隐藏了,但是可以在类内部使用
def get_age(self): #self不要忘哦
return self.__age
#使用
newC = newClass('1Ran')
1Ran
newC.get_age()
#我们可以拿到
18
#让我们做一下改变
newC.__age = 20
#看似成功了
newC.get_age()
#18岁,不是改了20嘛。这里就可以证明了,在使用self.__age 与newC.__age并不是一个
18
3.类属性
类属性是什么,就是通过类名来调用的属性...是不是有点无语
举个例子吧
class newClass(object):
def __init__(self,name):
self.name = name
print self.name
__age = 18
#这就是类属性哦
score = 0
你没看错新添加的属性就是类属性,我们可以这样用:
#查看
newClass.score
0
#设置值
newClass.score = 20
#查看
newClass.score
20
有什么用呢,比如你在玩一个游戏,游戏一般有自高分喽
于是我们这样写:
class newGame(object):
def __init__(self,name):
self.name = name
self.score = 0
maxScore = 0
#设置玩家分数
def set_myScore(self,score):
self.score = score
#获取最高分
def get_maxScore(self):
#当玩家分数高于最高分时,更新最高分
if newClass.maxScore < self.score:
newClass.maxScore = self.score
return newClass.maxScore
#我创建了一个角色,起名1Ran
me = newGame('1Ran')
#查看一下最高分
me.get_maxScore()
0
#玩过游戏后我得了10分于是我成了最高的
me.set_myScore(10)
me.get_maxScore()
#没有问题,最高分已经更新为了10分
10
#经不住诱惑你也玩这个游戏了
you = newGame('you')
#你先查看了一下最高分
you.get_maxScore()
10
#好强的你想要成为第一,于是你玩啊玩,玩到了100分
you.set_myScore(100)
#查看一下确实是100分了
you.get_maxScore()
100
#我隔天一查发现分数太高了,于是我放弃了
me.get_maxScore()
100
#但是GM是个心机婊,默默在后天执行了一句
newGame.maxScore = 1000
于是。。。