类和实例
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'