python2.7学习笔记(9) ——面向对象编程

时间:2022-09-18 17:26:17

类和实例

class Student(object):
pass

类名通常以大写字母开头的单词
括号里表示继承哪个类,没有合适的继承类就写object,因为所有的类最终都会继承object这个类

类中定义的函数第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数和关键字参数。

访问限制

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

双下划线开头的实例变量是不是一定不能从外部访问呢?
其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:

但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名

总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉

继承和多态

多态真正的威力:调用方只管调用,不管细节

获取对象信息

当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?

  • 判断对象类型:type()
    Python把每种type类型都定义好了常量,放在types模块里,使用之前,需要先导入:
>>> import types
>>> type('abc')==types.StringType
True
>>> type(u'abc')==types.UnicodeType
True
>>> type([])==types.ListType
True
>>> type(str)==types.TypeType
True

最后注意到有一种类型就叫TypeType,所有类型本身的类型就是TypeType,比如:

>>> type(int)==type(str)==types.TypeType
True
  • 判断一个对象是不是某种类型:isinstance()
    isinstance(A, B)
    判断A对象是不是B类型

  • dir()
    获得一个对象的所有属性和方法

配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:

>>> hasattr(obj, 'x') # 有属性'x'吗?

>>> setattr(obj, 'y', 19) # 设置一个属性'y'

>>> getattr(obj, 'y') # 获取属性'y'

>>> obj.y # 获取属性'y'