Python面向对象技术

对象(object):基本上可以看做数据(特性)以及由一系列可以存取、操作这些数据的方法所组成的集合。使用对象替代全局变量和函数的原因有很多种,其中对象最重要的优点包括以下几点:

多态(Polymorphism):

意味着就算不知道变量所引用的对象类型是什么,还是能对它进行操作,而它也会根据对象(或类)类型的不同而表现出不同的行为。

封装(Encapsulation):

指向程序中的其他部分隐藏对象的具体实现细节的原则。

继承(Inheritance):

以通用的类为基础建立专门的类对象。

创建类:

_metaclass_=type #确定使用新式类

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('Luke Skywalker')
bar.setName('Anakin Skywalker')
foo.greet()
bar.greet()


输出:
Hello world! I'm Luke Skywalker
Hello world! I'm Anakin Skywalker

参数self:是对于对象自身的引用,在调用foo的setName和greet函数时,foo自动将自己作为第一个参数传入函数中-------因此形象的命名为self。

特性、函数和方法:

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

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 have a self!
i don't...

注意:self参数并不依赖于调用方法的方式,前面我们使用的是instance.method(实例.方法)的形式,可以随意使用其他变量引用同一个方法:

class Bird:
    song='Squaawk!'
    def sing(self):
        print(self.song)
bird =Bird()
bird.sing()
birdsong=bird.sing
birdsong()

输出:
Squaawk!
Squaawk!

变量birdsong引用绑定方法bird.sing上,也就意味着这还是会对self参数进行访问(它仍旧绑定到类的相同实例上)。

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

class Filter:#作为SPAMFilter的超类
    def init(self):
        self.blocked=[]
    def filter(self,sequence):
        return [x for x in sequence if x not in self.blocked]
class SPAMFilter(Filter):#SPAMFilter是Filter的子类,将“SPAM'从序列中过滤出去
    def init(self):#重写Filter超类中的init方法
        self.blocked=['SPAM']

f=Filter()
f.init()
print(f.filter([1,2,3,'SPAM']))
s=SPAMFilter()
s.init()
print(s.filter(['SPAM','SPAM','SPAM','EGGS','BACON','SPAM']))#继承了Filter方法中的filter方法


输出:
[1, 2, 3, 'SPAM']
['EGGS', 'BACON']

检查继承:要想查看一个类是否是另一个的子类,可以使用内建的issubclass函数:

print(issubclass(SPAMFilter,Filter))
print(issubclass(Filter,SPAMFilter))

输出:
True
False

猜你喜欢

转载自blog.csdn.net/qq_38360675/article/details/85000864