python中类和类型详解

类是什么

可以视为种类或者类型的同义词。所有的对象都属于某一个类,称为类的实例。

例如:鸟就是”鸟类”的实例。这就是一个有很多子类的一般(抽象)类:看到的鸟可能属于子类”百灵鸟”。可以将”鸟类”想象成所有鸟的集合,而”百灵鸟类”是其中的一个子集。当一个对象所属的类是另外一个对象所属类的子集时,前者就被称为后者的子类,所以”百灵鸟类”是”鸟类”的子类,”鸟类”是”百灵鸟类”的超类

定义子类只是个定义更多方法的过程

创建类

>>> class person:
def setname(self,name):
self.name=name
def getname(self):
return self.name
def greet(self):
print “hello,world! i’m %s” % self.name
>>> foo=person()
>>> bar=person()
>>> foo.setname(‘nsds’)
>>> bar.setname(‘ysdy’)
>>> foo.greet()
hello,world! i’m nsds
>>> bar.greet()
hello,world! i’m ysdy

在调用foo的setname和greet函数时,foo自动将自己作为第一个参数传入函数中,因此命名为self。没有self的话,成员方法就没法访问他们要对其特性进行操作的对象本身了

特性是可以外部访问的:

>>> foo.name
‘nsds’
>>> bar.name=’yoda’
>>> bar.greet()
hello,world! i’m yoda

特性、函数、方法

self参数事实上正是方法和函数的区别。方法将它们的第一个参数绑定到所属的实例上,因此这个参数可以不必提供。所以可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数了:

(特性是对象内部的变量,对象的状态由它的特性来描述,对象的方法可以改变它的特性,可以直接从对象外部访问特性)

>>> class class:
def method(self):
print ‘i have a self!’
>>> def function():
print “i don’t…”
>>> s=class()
>>> s.method()
i have a self!
>>> s.method=function
>>> s.method()
i don’t…

变量birdsong引用绑定方法bird.sing上,还是对self参数的访问(仍旧绑定到类的相同实例上)

>>> class bird:
song=’squaawk’
def sing(self):
print self.song
>>> bird=bird()
>>> bird.sing()
squaawk
>>> birdsong=bird.sing
>>> birdsong()
squaawk

在名称前加上双下划线,可以让方法或者特性变为私有(从外部无法访问)

>>> class secretive:
def __inaccessible(self):
print “bet you can’t see me…”
def accessible(self):
print “the secret message is:”
self.__inaccessible()
>>> s=secretive()
>>> s.__inacessible()
traceback (most recent call last):
file “”, line 1, in
s.__inacessible()
attributeerror: ‘secretive’ object has no attribute ‘__inacessible’
>>> s.accessible()
the secret message is:
bet you can’t see me…

在类的内部定义中,所有以双下划线开的名字都被”翻译”成前面加上单下划线和类名的形式

>>> secretive._secretive__inaccessible
>>> s._secretive__inaccessible()
bet you can’t see me…

类的命名空间

定义类时,所有位于class语句中的代码都在特殊的命名空间中执行—类的命名空间。这个命名空间可由类内所有成员访问。

类的定义其实就是执行代码块

>>> class membercounter:
members=0
def init(self):
membercounter.members+=1
>>> m1=membercounter()
>>> m1.init()
>>> m1.members
>>> m1.members=2
>>> m1.members
>>> m2=membercounter()
>>> m2.init()
>>> m2.members
>>> m2.init()
>>> m2.members
>>> m1.members
>>>

新members值被写到了m1的特性中,屏蔽了类范围内的变量

超类

>>> class filter:
def init(self):
self.blocked=[]
def filter(self,sequence):
return [x for x in sequence if x not in self.blocked]
>>> class spamfilter(filter):
def init(self):
self.blocked=[‘spam’]
>>> f=filter()
>>> f.init()
>>> f.filter([1,2,3])
[1, 2, 3]
>>> s=spamfilter()
>>> s.init()
>>> s.filter([‘spam’,’spam’,’egg’,’name’,’ff’])
[‘egg’, ‘name’, ‘ff’]

继承,超类

>>> class filter:
def init(self):
self.blockes=[]
def filter(self,sequence):
return [x for x in sequence if x not in self.blocked]
>>> class s(filter):
def init(self):
self.blocked=[‘s’]
>>> f=filter()
>>> f.init()
>>> f.filter([1,2,3])

多个超类

先继承的类中的方法会重写后继承的类中的方法

>>> class c():
def calculate(self,expression):
self.value=eval(expression)
>>> class talker():
def talk(self):
print ‘hi,my value is’,self.value
>>> class talkingcalculator(c,talker):
pass
>>> tc=talkingcalculator()
>>> tc.calculate(‘1+2*3’)
>>> tc.talk()
hi,my value is 7

更多python中类和类型详解相关文章请关注php中文网!

Posted in 未分类

发表评论