来学Python面向对象的特性(一天讲了太多东西,真就填鸭。。)
类定义:
class Student(object):
这里括号内就表示继承基类,所有类都继承为object这个“超级类”
class Student(object):
def __init__(self, name):
self.name = name
用以上代码定义类函数,函数名前后有两个下划线的表示特殊函数
如这里是__init__是构造函数,第一个参数是self表示指向自己这个对象。
所有的面向对象特殊函数指路:
https://www.cnblogs.com/angelyan/p/10366961.html
“静态”成员
Python中没有静态成员变量的说法,但是也可以给类本身绑定变量
直接在外部指定就可以
Student.num=100;
属于类的变量可以由所有的实例对象访问输出
所以说千万不能让类的变量与实例对象的变量名称一样!
访问限制:
Python中没有public、protect等标识符,
但是可以在实例的变量名前加双下划线__使之成为私有成员变量,
外部无法直接访问,
这样之后再编写访问私有成员的接口函数,可以实现封装。
但这样的封装是比较弱的,
因为加双下划线不能真正使之成为私有,
本质只是偷偷改了一下名字:
只是这样的改名方法在不同版本不一样,所以不建议用这种方式访问成员变量。
重点:
在python中,有另一种的实现封装的方法,使得接口变得方便同时,为成员变量限制值。
用到了上一节学到的“装饰器”的概念:
@property
def score(self):
return self._score
将score()成员函数视为一个属性(成员变量),它返回_score的值
@score.setter
def score(self,value):
if value<0 or value>100:
print("分数应该在0到100之间")
return
self._score=value
说明当在外部调用s.score=xxx时,运行s.score(xxx) 在外部貌似就不能用s.score(xxx)了
以上有三个score,他们必须保持命名一致。
这也好理解,
一个是为了读取_score,
一个是为了设置_score,
但是对外都是用s.score统一的,
当然要用同样的命名实现这种统一
继承与多态:
Python的继承与多态和C++相近,继承方法前文已有。多继承这种特性不用也罢。
C++要用这里也都适用
Python可以用isinstance()来判断一个对象是否属于某一个类
(子类当然是父类,但是父类不是子类)