Python基础教程第7章笔记

创建自己的对象(尤其是类型或者被称为类的对象)是python的核心概念——非常核心,事实上,python被称为面向对象的语言。

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

    • 多态(Polymorphism):意味着可以对不同类的对象使用同样的操作,他们会像被“施了魔法一般”工作。(按照我个人的理解,就是同一个函数或方法,会对参数对象的类型不同,都能获得相应的操作结果。)
    • 封装(Encapsulation):对外部世界隐藏对象的工作细节。
    • 继承(Inheritance):以通用的类为基础建立专门的类对象。
      在作者来看,面向对象程序设计的最有趣的特性就是多态。
  • 类:
    当一个对象所属的类是另外一个对象所属类的子集时,前者就被称为后者的子类(subclass),所以,“百灵鸟类”是“鸟类”的子类。相反,“鸟类”是“百灵鸟类”的超类(superclass)或者叫基类。

  • 创建类:

__metaclass__ = type #确定新式类(详见第9章)
class Person:
    def setName(self,name):
        self.name = name
    def getName(self,name):
        return self.name
    def greetName(self,name):
        print "hello,world,i'm %s"%self.name

class语句会在函数定义的地方创建自己的命名空间。
self参数看起来有点奇怪,它是对象自身的引用。只有在类方法中才有,在调用时不必传入相应的参数,指的是类实例对象本身。
调用:

>>>foo = Person()
>>>bar = Person()
>>>foo.setName('michael')
>>>bar.setName('qiuqiu')
>>>foo.greet()
hello,world,i'm michael
>>>bar.greet()
hello,world,i'm qiuqiu

对于这个变量,每个人可以自己命名。只是因为它总是对象自身,所以习惯上总是叫做self。显然,这就是self的用处和存在的必要性。没有它的话,成员方法就没法访问他们要对其特性进行操作的对象本身了。

  • 特性、函数和方法
    self参数事实上正是方法和函数的区别。方法(更为专业点可以称为绑定方法)将它们的第一个参数绑定到所属的实例上,因此你无需显示提供该参数。当然,也可以将特性绑定到一个普通的函数上。
    第9章中,将会介绍有关属性(property)的知识,它是访问器(accessor)最有利的替代者。

  • python不直接支持私有方式。为了让方法或者特性私有,只要在名字前面加上双下划线即可。
    例如:

class Secretive:
    def __inaccessible(self):
        print "..."
    def accessible(self):
        print "the secret message is"
        self.__inaccessible()

但仍可以用s = Secretive();s._Secretive__inacessible()访问。

  • 类的命名空间:
    所有位于class语句中的代码都在特殊的命名空间中执行——类命名空间(class namespace)。这个命名空间可由于类内所有成员访问。
    并不是所有Python程序员都知道类的定义其实就是在执行代码块!!!
    比如,在类的定义区并不是只限定只能使用def语句:
>>>class C:
        print 'class c being defined'

class c being defined
>>>

在类作用域内定义了一个可供成员(实例)访问的变量,用来计算类的成员数量。
就像方法一样,类作用域内的变量也可以被所有实例访问:

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

那么在实例中重绑定members特性呢?

>>>m1.members = "two"
>>>m1.members
"two"
>>>m2.members
2

新menmbers值被写到了m1`特性中,屏蔽了类范围内的变量。这跟函数内的局部变量和全局变量的行为十分类似!

  • 检查继承:
    如果想要查看一个类是否是另一个的子类,可以使用内建的issubclass函数:
>>>issubclass(SPAMFilter,Filter)
True
>>>issubclass(Filter,SPAMFilter)
Flase

如果想要知道已知类的基类(们),可以直接使用它的特殊特性_ _ bases _ _:

>>>SPAMFilter.__bases__
(<class __main__.Filter at 0x171e40>,)

同样,还能使用isinstance方法检查一个对象是否是一个类的实例:

>>>s=SPAMFilter()
>>>isinstance(s,SPAMGFilter)
True

使用isinstance并不是个好习惯,使用多态会更好一点
如果想知道一个对象属于哪个类,可以使用_ _ class _ _特性:

>>>s.__class__
<class __main__.SPAMFilter at 0x0330EB58>

如果使用_ _ metaclass _ _=type或从object继承的方式来定义新式类,那么可以使用type(s)查看实例所属的类。

  • 多个超类:
    如果一个方法从多个超类继承(也就是说你有两个具有相同名字的不同方法),那么必须注意一下超类的顺序(class语句中):先继承的类中的方法会重写后继承的类中的方法。

涉及的新函数:

函数描述
callable(object)确定对象是否可调用(比如函数或者方法)
getattr(object,name[,default])确定特性的值,可以选择提供默认值
hasattr确定对象是否有给定的特性
setattr(object,name,value)设定对象的给定特性为value
random.choice(sequence)从非空序列中随机选择元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值