1.类和实例
1.1类的定义
类的定义使用class关键字,其后紧跟类名(通常大写开头),紧接着是(object)
,object是该类继承的类名,没有就继承object类。
实例化时就是类名+(),有参数需要传入参数。
class Student(object):
pass
bart = Student()
类的属性定义在_init_方法中(相当于java的构造方法),该方法的第一个参数永远是self,在实例化时必须传入相应的参数(除self外)
class Student(object): def __init__(self, name, score):
self.name = name
self.score = scorebart = Student('Bart Simpson', 59)
1.2方法的参数
类方法的参数第一个必须是self,而且不用传入。其余的参数和普通函数无异,也可以使用默认参数,可变参数和关键字参数。
1.3关于实例变量
因为python是动态语言,允许对实例添加新的变量,所以一个类的两个实例变量个数和名称不一定相同。
>>> bart = Student('Bart Simpson', 59)
>>> lisa = Student('Lisa Simpson', 87)
>>> bart.age = 8
>>> bart.age
8
>>> lisa.age
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'age'
2.访问限制
在Python中,实例的变量名如果以__(双底杠)
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。外部要获取或更改该变量值可以通过set,get方法,set方法内部还需要进行参数检查。此外双底杠开头双底杠结尾的变量是特殊变量,变量命名时不要用这种方式命名。
class Student(object): def __init__(self, name, score):
self.__name = name
self.__score = score
3.继承与多态
python的继承与多态和java类似,遵循“开闭原则”:对扩展开放,对修改封闭。但python支持多重继承,如果父类有相同的方法,调用时会从左到右搜索,其余部分后面专门会讲。
4.获取对象信息
4.1 type函数:type(object),返回type类型
4.2 isinstance函数:isinstance(实例,类名),返回布尔值
4.3 dir函数:dir(object),返回一个包含该对象所有方法,属性的字符串list
4.4 __xxx__
的属性和方法在Python中都是有特殊用途的,例如__len__方法,下面两种用法等价:(个人认为一种是函数写法,一种是类方法写法)
>>> len('ABC')
3
>>> 'ABC'.__len__()
3
4.5 getattr()
、setattr()
以及hasattr()函数:可以直接操作一个对象的状态。如下所示:
>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19
可以传入一个default参数,如果属性不存在,就返回默认值:
>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
404