zoukankan      html  css  js  c++  java
  • python的类和对象2(self参数)

    python的类和对象2(self参数)

    1、python里面对象的方法都会有self参数,它就相当于C++里面的this指针;绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在调用方法了,你可以认为方法中的 self 其实就是实例对象的唯一标志

    2、__init__(self)称作:魔法方法,类在实例化以后会主动进行调用

    举例如下:

    3、在python编程里面类的定义里面,类的属性一般可以分为私有和共有两大类,对于一般的属性定义都是指类的共有属性,可以被外界直接访问,而私有属性是在类的属性前面加上两个下划线,对于私有属性的访问外界不可以直接访问,私有属性其实在python编程里面将其定义为了:_类名__属性,可以直接访问它就可以访问到私有属性

        __name=“燕江依”

    例如如下:

    class Person2:

       __name="yjy"

    运行结果如下:


    4、我们把getName方法称之为“访问器”。Python事实上是采用一种叫“name mangling”技术,将以双下划线开头的变量名巧妙的改了个名字而已,我们仍然可以在外部通过“_类名__变量名”的方式访问

    5、我们常说的类指的是类定义,由于“Python无处不对象”,所以当类定义完之后,自然就是类对象在这个时候,你可以对类的属性(变量)进行直接访问(MyClass.name)。

    一个类可以实例化出无数的对象(实例对象),Python 为了区分是哪个实例对象调用了方法,于是要求方法必须绑定(通过 self 参数)才能调用。而未实例化的类对象直接调用方法,因为缺少 self 参数,所以就会报错

    6,综合举例:

        游戏编程:按以下要求定义一个乌龟类和鱼类并尝试编写游戏。
    O    假设游戏场景为范围(x, y)为0<=x<=10,0<=y<=10

    • 游戏生成1只乌龟和10条鱼
    • 它们的移动方向均随机
    • 乌龟的最大移动能力是2(Ta可以随机选择1还是2移动),鱼儿的最大移动能力是1
    • 当移动到场景边缘,自动向反方向移动
    • 乌龟初始化体力为100(上限)
    • 乌龟每移动一次,体力消耗1
    • 当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
    • 鱼暂不计算体力
    • 当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束

    实现代码如下:

      1. import random as r

      2. legal_x = [0, 10]
      3. legal_y = [0, 10]

      4. class Turtle:
      5.     def __init__(self):
      6.         # 初始体力
      7.         self.power = 100
      8.         # 初始位置随机
      9.         self.x = r.randint(legal_x[0], legal_x[1])
      10.         self.y = r.randint(legal_y[0], legal_y[1])

      11.     def move(self):
      12.         # 随机计算方向并移动到新的位置(x, y)
      13.         new_x = self.x + r.choice([1, 2, -1, -2])
      14.         new_y = self.y + r.choice([1, 2, -1, -2])
      15.         # 检查移动后是否超出场景x轴边界
      16.         if new_x < legal_x[0]:
      17.             self.x = legal_x[0] - (new_x - legal_x[0])
      18.         elif new_x > legal_x[1]:
      19.             self.x = legal_x[1] - (new_x - legal_x[1])
      20.         else:
      21.             self.x = new_x
      22.         # 检查移动后是否超出场景y轴边界
      23.         if new_y < legal_y[0]:
      24.             self.y = legal_y[0] - (new_y - legal_y[0])
      25.         elif new_y > legal_y[1]:
      26.             self.y = legal_y[1] - (new_y - legal_y[1])
      27.         else:
      28.             self.y = new_y        
      29.         # 体力消耗
      30.         self.power -= 1
      31.         # 返回移动后的新位置
      32.         return (self.x, self.y)

      33.     def eat(self):
      34.         self.power += 20
      35.         if self.power > 100:
      36.             self.power = 100

      37. class Fish:
      38.     def __init__(self):
      39.         self.x = r.randint(legal_x[0], legal_x[1])
      40.         self.y = r.randint(legal_y[0], legal_y[1])
      41.         
      42.     def move(self):
      43.         # 随机计算方向并移动到新的位置(x, y)
      44.         new_x = self.x + r.choice([1, -1])
      45.         new_y = self.y + r.choice([1, -1])
      46.         # 检查移动后是否超出场景x轴边界
      47.         if new_x < legal_x[0]:
      48.             self.x = legal_x[0] - (new_x - legal_x[0])
      49.         elif new_x > legal_x[1]:
      50.             self.x = legal_x[1] - (new_x - legal_x[1])
      51.         else:
      52.             self.x = new_x
      53.         # 检查移动后是否超出场景y轴边界
      54.         if new_y < legal_y[0]:
      55.             self.y = legal_y[0] - (new_y - legal_y[0])
      56.         elif new_y > legal_y[1]:
      57.             self.y = legal_y[1] - (new_y - legal_y[1])
      58.         else:
      59.             self.y = new_y
      60.         # 返回移动后的新位置
      61.         return (self.x, self.y)

      62. turtle = Turtle()
      63. fish = []
      64. for i in range(10):
      65.     new_fish = Fish()
      66.     fish.append(new_fish)

      67. while True:
      68.     if not len(fish):
      69.         print("鱼儿都吃完了,游戏结束!")
      70.         break
      71.     if not turtle.power:
      72.         print("乌龟体力耗尽,挂掉了!")
      73.         break

      74.     pos = turtle.move()
      75.     # 在迭代器中删除列表元素是非常危险的,经常会出现意想不到的问题,因为迭代器是直接引用列表的数据进行引用
      76.     # 这里我们把列表拷贝给迭代器,然后对原列表进行删除操作就不会有问题了^_^
      77.     for each_fish in fish[:]:
      78.         if each_fish.move() == pos:
      79.             # 鱼儿被吃掉了
      80.             turtle.eat()
      81.             fish.remove(each_fish)
      82.             print("有一条鱼儿被吃掉了...")
  • 相关阅读:
    PCLVisualizer可视化类(4)
    PCLVisualizer可视化类(3)
    PCLVisualizer可视化类(2)
    PCLVisualizer可视化类(1)
    怎样可视化深度图像
    如何从深度图像中提取边界
    如何从点云创建深度图像
    Codeforces Round #235 (Div. 2) C. Team
    next_permutation函数
    安慰奶牛 蓝桥杯
  • 原文地址:https://www.cnblogs.com/Yanjy-OnlyOne/p/9998866.html
Copyright © 2011-2022 走看看