Python学习笔记——面向对象基础
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是动态语言,允许对实例添加新的变量,所以一个类的两个实例变量个数和名称不一定相同。
1 >>> bart = Student('Bart Simpson', 59) 2 >>> lisa = Student('Lisa Simpson', 87) 3 >>> bart.age = 8 4 >>> bart.age 5 8 6 >>> lisa.age 7 Traceback (most recent call last): 8 File "<stdin>", line 1, in <module> 9 AttributeError: 'Student' object has no attribute 'age'
2.访问限制
在Python中,实例的变量名如果以__(双底杠)
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。外部要获取或更改该变量值可以通过set,get方法,set方法内部还需要进行参数检查。此外双底杠开头双底杠结尾的变量是特殊变量,变量命名时不要用这种方式命名。
1 class Student(object): 2 3 def __init__(self, name, score): 4 self.__name = name 5 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__方法,下面两种用法等价:(个人认为一种是函数写法,一种是类方法写法)
1 >>> len('ABC') 2 3 3 >>> 'ABC'.__len__() 4 3
4.5 getattr()
、setattr()
以及hasattr()函数:可以直接操作一个对象的状态。如下所示:
1 >>> hasattr(obj, 'x') # 有属性'x'吗? 2 True 3 >>> obj.x 4 9 5 >>> hasattr(obj, 'y') # 有属性'y'吗? 6 False 7 >>> setattr(obj, 'y', 19) # 设置一个属性'y' 8 >>> hasattr(obj, 'y') # 有属性'y'吗? 9 True 10 >>> getattr(obj, 'y') # 获取属性'y' 11 19 12 >>> obj.y # 获取属性'y' 13 19
可以传入一个default参数,如果属性不存在,就返回默认值:
1 >>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404 2 404