Python 基础之面向对象

来源:互联网 发布:淘宝生意参谋手机版 编辑:程序博客网 时间:2024/06/04 18:16

  • 面向对象
    • 多态
      • 多态和方法
      • 多态的多种形式
    • 封装
    • 继承
  • 类和类型
    • 类到底是什么
    • 创建一个类
    • 继承父类
    • 多重继承

面向对象

  • 多态:意味着可以对不同类的对象使用相同的操作。
  • 封装:对外部世界隐藏对象的工作细节。
  • 继承:以普通的类为基础建立专门的类对象。

多态

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

多态和方法

程序得到了一个对象,但是并不知道它是怎么实现的——它可能有多种“形状”。

绑定到对象特性上面的函数称为方法(method)。

对于一个变量x来说,我们不需要知道他是字符串还是列表,就可以调用它的count方法——不用管它是什么类型(前提是你提供了一个字符作为参数)。

from random import choicex=choice(['Hello,world!',[1,2,'e','e',3]])  #random 中的 choice函数,可以从序列中随机的选出元素给变量赋值print(x.count('e'))

对于上述代码只需要知道x有个叫做count的方法,带有一个字符作为参数,并且返回整数值就够了。

多态的多种形式

任何不知道对象是什么类型,但是又必须为对象实现某种功能的时候,都会用到多态。

例如:

def add(x,y):    return x+ya=1b=2print(add(a,b))a='Hello 'b='world!'print(add(a,b))

很多函数和运算符都是多态的——至少你写的大部分程序可能都是,即使你不是有意这样。

封装

封装是对全局作用域中其他区域隐藏多余信息的原则。听着有点像多态——适用对象而不知内部细节。两者概念类似,二者都会帮助处理程序组件而不用过多关注多余细节。

封装并不等同于多态多态。多态可以让用户对于不知道是什么类的对象进行方法调用,而封装是不用关心对象是如何构建的而直接使用。

继承

继承是另外一种懒惰行为。作为一个苦逼的程序员自然不想把同一段代码写好几次。显然可以使用函数来解决。但是倘若现在已经有了一个类,而现在又想创建一个类似的新的类
新的类可能保留了原本的类的大多数方法,可能只需要扩展几个新的方法。在编写新类的时候又不想把旧类的方法全部拷贝过去,那么这个时候就是继承出场的时候了。

类和类型

类到底是什么?

可以将类或多或少的视为种类或者类型的同义词。从很多方面来说,这就是类——一种对象。所有的对象都属于一个类,称为类的实例(instance)。

例如:阿尔托利亚·潘德拉贡 属于“Servant”类的实例。但是“Servant”类是有很多子类诸如“Saber”、“Archer”、“Rider”等类的一般(抽象)类。并且吾王(阿尔托利亚·潘德拉贡)本身也属于“Saber”类。这个时候“Saber”类就是“Servant”类的子类。反过来说“Servant”类是“Saber”类的父类也称超类。

在面向对象的程序设计中,子类的关系是隐式的,一个类的定义取决它所支持的方法。所有类的实例都会包括这些方法。子类也会继承父类的方法。

创建一个类

class + 类名() + “:”

class Person(object):    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("Asunna")bar.setName('Saber')foo.greet()bar.greet()#结果:# Hello world!I'm Asunna.# Hello world!I'm Saber.

self表示对自身对象的引用。在调用foo的setName方法时,foo自动的将自己作为第一参数传入函数中——因此形象的命名为self。

继承父类

将其他类名写在class语句后的圆括号内就表示可以继承父类

class Filter(object):    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):   #重写父类中的init方法        self.blocked=["SPAM"]f=Filter()f.init()print(f.filter([1,2,3]))s=SPAMFilter()s.init()print(s.filter(["Spam","SPAM","SPAM",'spam',"ASPM"]))#result:# [1, 2, 3]# ['Spam', 'spam', 'ASPM']

多重继承

子类可以继承多个父类,方法如下:

class Cal(object):    passclass Tal(object):    passclass TC(Cal,Tal):    pass

在使用多重继承时,有个需要注意的地方。如果一个方法从多个超类中继承(换句话说你有两个具有相同名字的不同方法),那么必须要注意一下超类的顺序:先继承的类中方法会重写后继承的类中的方法。

如果父类们共享一个父类,那么在查找给定方法或者特性的时访问的父类顺序称为MRO(Method Resolution Order,方法判定顺序)。