13. Python脚本学习笔记十三类与对象

来源:互联网 发布:vue js 折叠面板例子 编辑:程序博客网 时间:2024/06/05 04:29

13. Python脚本学习笔记十三类与对象

                  本篇名言:“人生如梦,岁月无情.蓦然回首,才发现人活着是一种心情,穷也好,富也好,得也好,失也好.一切都是过眼云烟,只要心情好,一切都好!

                  由于Python被称做面向对象的语言,所以对象什么的就是Python核心概念了。

                  关于对象的具体,蛤蟆不再此处详述了。

1.  创建类

如下所示:

class Person:

    def setName(self,name):

        self.name=name

    def getName(self,name):

        return self.name

    def greet(self):

        print "Hello,world! I'm %s." %self.name

 

foo=Person()

bar=Person()

foo.setName('Luke Sky')

bar.setName('Anak')

foo.greet()

bar.greet()

输出如下:

Hello,world!I'm Luke Sky.

Hello,world!I'm Anak.

 

类把自己作为第一个参数传入函数中,命名为self。

 

2.  特性、函数和方法

class Class:

    def method(self):

        print 'I have a self!'

 

def function():

    print "I don't..."

 

instance=Class()

instance.method()

instance.method=function

instance.method()

输出如下所示:

I havea self!

Idon't ...

 

通过实例调用方法,将实例中的方法给替换掉又继续调用。

 

为了让方法或者特性变成私有,从外部无法访问,只要在它名字前面加上双下划线即可。

>>> class Secretive:

...    def __inaccesible(self):

...        print "bet you can not see me..."

...    def accessiablez(self):

...        print "The secret message is :"

...        self.__inaccesible()

...

>>> s=Secretive()

>>> s.__inaccesible()

Traceback (most recent call last):

 File "<stdin>", line 1, in <module>

AttributeError: Secretive instance has noattribute '__inaccesible'

>>> s.accessiablez()

The secret message is :

bet you can not see me...

 

看,直接访问__开头的方法是会报错的。

不够调用如下还是能访问的其实:

>>> s._Secretive__inaccesible()

bet you can not see me...

是不是很诡异?

只是编译的时候被翻译成加上单下划线和类名的形式而已。

 

3.  类的命名空间

来看两个函数:

def foo(x): return x*x

foo=lambda x: x*x

功能基本一样,都将变量foo绑定到函数了。

定义类时,同样事情也会发生。

如下,在类作用域内定义了一个可供所有成员访问的变量。发现2个实例m1,m2其实是共享了类作用域内的变量。

class MemberCounter:

    member=0

    def init(self):

        MemberCounter.member+=1

 

m1=MemberCounter()

m1.init()

print m1.member

m2=MemberCounter()

m2.init()

print m2.member

 

做重新绑定后,就屏蔽盖问题了如下:

m1.member='wo'

print m1.member

print m2.member

输出如下:

wo

2

4.  指定超类

子类可以扩展超类的定义。将其他类名写在class语句后的圆括号内可以指定超类。

就是理解成子类。继承父类的方法和变量。

如下示例:

classFilter:

    definit(self):

        self.blocked=[]

    deffilter(self,sequence):

        return [xfor xin sequenceif xnotinself.blocked ]

classSPAMFilter(Filter):

    definit(self):

        self.blocked=['SPAM']

       

       

f=Filter()

f.init()

printf.filter([1,2,3])

s=SPAMFilter()

s.init()

print s.filter(['SPAM','ok','error','SPAM'])

输出 如下:

[1, 2,3]

['ok', 'error']

5.  调查继承

查看一个类是否是另一个类的子类,通过内建issubclass函数来实现。

执行如下:

print issubclass(SPAMFilter,Filter)

print issubclass(Filter, SPAMFilter)

输出如下:

True

False

可以使用类的特殊特性__bases__,instance方法检查基类与是否是类的实例

print SPAMFilter.__bases__

print isinstance(s,SPAMFilter)

输出如下:

(<class__main__.Filter at 0x01DF7CE0>,)

True

查找对象属于哪个类,可以使用__class__特性

6.  多个超类

这个就是多重继承。非常有用。不过如果不是很熟练,就不要使用,会出现不可预测的问题。

 

 

 

 

 

 

阅读全文
0 0
原创粉丝点击