**#Python入门36-40**
知识点:
0. 对象 = 属性 (变量)+ 方法(函数)
1.OO(Object Oriented 面向对象)的特征:
- 封装:信息隐蔽技术
- 继承:子类自动共享父类之间数据和方法的机制
- 多态:不同对象对同一方法响应不同的行动
2.self:相当与c++的this指针
3.Python的魔法方法:_init _(self, param1 , param2 …)
4.公有和私有
-
公有:属性和方法都是公开的,可以通过.操作符来访问。在Python中定义私有变量只需要在变量名或函数名前加上"__"两个下划线,name这个函数或变量就会变为私有。(实际上变为了_ 类名_ _变量名)
name mangling(名字改编,名字重整)
可以通过p._person__name来访问 -
私有:
5.继承: class DerivedClassName(父类名):
6.
- 调用未绑定的父类方法
- 使用super函数
7.多重继承:class DerivedClassName(父类1,父类2,父类3…):容易导致代码混乱,尽量避免使用。
8.组合:定义一个类,叫水池,水池里要有乌龟和鱼。
9.
- 不要试图在一个类里面定义出所有能想到的属性和方法,应该利用继承和组合机制来进行扩展。
- 用不同的词性命名,如属性名用名词,方法名用动词。
10.一些相关的BIF
- issubclass(class,classinfo):检测两个类是否是继承关系,若是返回True,不是返回False
- isinstance(object, classinfo):检查前面一个对象是否是后面那个类的实例对象。
- hasatte(object,name):测试一个对象是否有属性名
- getatte(object,name[,default]):name要加单引号
- setatte(object, name, value)
- delatte(ovjectm, name)
- property(fget=None, fset=None,fdel= None, doc= None):通过属性来设置属性。
课后练习:
0.按照以下提示尝试定义一个Person类并生成类实例对象。
属性:姓名(默认姓名为“小甲鱼”)
方法:打印姓名
提示:放法中对属性的引用形式加上self,如self.name
1.按照以下提示尝试定义一个矩阵类并生成类实例对象。
属性:长和宽
方法:设置长和宽->setRect(self),获得长和宽->getRect(self),获得面积->getArea(self)
提示:方法中对属性的引用形式加上self,如self.width
2.self参数的作用是什么?
绑定方法。self参数类似于人的身份证,每个实例对象都有唯一的self参数。
3.如果我们不希望对象的属性或方法被外部直接引用,我们可以怎么做?
我们可以在属性或方法名字前边加上双下划线,这样子从外部是无法直接访问到,会显示AttributeError错误。因为加了“__”就变成私有元素,类外部不能直接访问,但可以通过类的方法间接访问。但其实Python只是把元素名改变了而已,可以通过“_类名__变量名”访问,即_Person__name。
4.按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。
a.平日票价100元
b.周末票价为平日的120%
c.儿童半价
5.游戏编程:按以下要求定义一个乌龟类和鱼类并尝试编写游戏。(初学者不一定可以完整实现,但请务必先自己动手,你会从中学习到很多知识的)
a.假设游戏场景为范围(x,y)为0<=x<=10,0<=y<=10
b.游戏生成1只乌龟和10条鱼
c.它们的移动方向均随机
d.乌龟的最大移动能力是2(Ta可以随机选择1还是2移动),鱼儿的最大移动能力是1
e.当移动到场景边缘,自动向反方向移动
f.乌龟初始化体力为100(上限)
g.乌龟每移动一次,体力消耗1
h.当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
i.鱼暂不计算体力