零基础入门学习Python(35)面向对象编程

self是什么?

  • Python的self相当于C++的this指针
  • 由同一个类可以生成无数对象,当一个对象的方法被调用的时候,对象会将自身的引用作为第一个参数传给该方法,Python就知道要操作哪个对象的方法了,
    在这里插入图片描述

_init_(self, param1, param2)方法(Python 的魔法方法之一)

  • _ _init_ _()方法称为构造方法,其魔力在于只要实例化对象,这个方法就会在对象被创建时自动调用
  • 实例化对象时是可以传入参数的,这些参数会自动传入_ _init_ _方法中,可以通过重写这个方法来自定义对象的初始化操作
    在这里插入图片描述
    在这里插入图片描述

共有还是私有

  • 默认对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问
    在这里插入图片描述
  • 为了实现类似私有变量的特征,Python内部采用了一种叫Name Mangling(名字改编)的技术,在Python中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会成为私有的了
    在这里插入图片描述
    在这里插入图片描述
  • 在外部使用“_类名__变量名”即可访问两个下划线开头的私有变量了,其实是伪私有,变量可以是被外部调用的
    在这里插入图片描述

Task

0. 以下代码体现了面向对象编程的什么特征?

>>> "FishC.com".count('o')
1
>>> [1, 1, 2, 3, 5, 8].count(1)
2
>>> (0, 2, 4, 8, 12, 18).count(1)
0

多态性
1. 当程序员不想把同一段代码写几次,他们发明了函数解决了这种情况。当程序员已经有了一个类,而又想建立一个非常相近的新类,他们会怎么做呢?
他们会定义一个新类继承已有的这个类,这样子就只需要简单添加和重写需要的方法即可。
2. self参数的作用是什么?
指针.绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在调用方法了,你可以认为方法中的 self 其实就是实例对象的唯一标志。
3. 如果我们不希望对象的属性或方法被外部直接引用,我们可以怎么做?;
使用双下划线“__”转变为私有变量
4. 类在实例化后哪个方法会被自动调用?

__init__
5. 请解释下边代码错误的原因:

class MyClass:
        name = 'FishC'
        def myFun(self):
                print("Hello FishC!")
                
>>> MyClass.name
'FishC'
>>> MyClass.myFun()
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    MyClass.myFun()
TypeError: myFun() missing 1 required positional argument: 'self'
>>>

我们常说的类指的是类定义,由于“Python无处不对象”,所以当类定义完之后,自然就是类对象。在这个时候,你可以对类的属性(变量)进行直接访问
一个类可以实例化出无数的对象(实例对象),Python 为了区分是哪个实例对象调用了方法,于是要求方法必须绑定(通过 self 参数)才能调用。而未实例化的类对象直接调用方法,因为缺少 self 参数,所以就会报错
6. 按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。
平日票价100元
周末票价为平日的120%
儿童半票

class Ticket():
        def __init__(self, weekend=False, child=False):
                self.exp = 100
                if weekend:
                        self.inc = 1.2
                else:
                        self.inc = 1
                if child:
                        self.discount = 0.5
                else:
                        self.discount = 1
        def calcPrice(self, num):
                return self.exp * self.inc * self.discount * num

>>> adult = Ticket()
>>> child = Ticket(child=True)
>>> print("2个成人 + 1个小孩平日票价为:%.2f" % (adult.calcPrice(2) + child.calcPrice(1)))
2个成人 + 1个小孩平日票价为:250.00

7. 游戏编程:按以下要求定义一个乌龟类和鱼类并尝试编写游戏。
假设游戏场景为范围(x, y)为0<=x<=10,0<=y<=10
游戏生成1只乌龟和10条鱼
它们的移动方向均随机
乌龟的最大移动能力是2(Ta可以随机选择1还是2移动),鱼儿的最大移动能力是1
当移动到场景边缘,自动向反方向移动
乌龟初始化体力为100(上限)
乌龟每移动一次,体力消耗1
当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
鱼暂不计算体力
当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束

  • 15
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值