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. def move(self):
    42. # 随机计算方向并移动到新的位置(x, y)
    43. new_x = self.x + r.choice([1, -1])
    44. new_y = self.y + r.choice([1, -1])
    45. # 检查移动后是否超出场景x轴边界
    46. if new_x < legal_x[0]:
    47. self.x = legal_x[0] - (new_x - legal_x[0])
    48. elif new_x > legal_x[1]:
    49. self.x = legal_x[1] - (new_x - legal_x[1])
    50. else:
    51. self.x = new_x
    52. # 检查移动后是否超出场景y轴边界
    53. if new_y < legal_y[0]:
    54. self.y = legal_y[0] - (new_y - legal_y[0])
    55. elif new_y > legal_y[1]:
    56. self.y = legal_y[1] - (new_y - legal_y[1])
    57. else:
    58. self.y = new_y
    59. # 返回移动后的新位置
    60. return (self.x, self.y)
    61. turtle = Turtle()
    62. fish = []
    63. for i in range(10):
    64. new_fish = Fish()
    65. fish.append(new_fish)
    66. while True:
    67. if not len(fish):
    68. print("鱼儿都吃完了,游戏结束!")
    69. break
    70. if not turtle.power:
    71. print("乌龟体力耗尽,挂掉了!")
    72. break
    73. pos = turtle.move()
    74. # 在迭代器中删除列表元素是非常危险的,经常会出现意想不到的问题,因为迭代器是直接引用列表的数据进行引用
    75. # 这里我们把列表拷贝给迭代器,然后对原列表进行删除操作就不会有问题了^_^
    76. for each_fish in fish[:]:
    77. if each_fish.move() == pos:
    78. # 鱼儿被吃掉了
    79. turtle.eat()
    80. fish.remove(each_fish)
    81. print("有一条鱼儿被吃掉了...")

python的类和对象2(self参数)的更多相关文章

  1. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  2. Python初识类与对象

    Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...

  3. python的类与对象

    类与对象 1.什么是类 类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问 ...

  4. python的类和对象——类成员番外篇

    学完了面向对象的三大特性,已经get了所有屌丝技能的我们也当一回文艺小青年,来看看类的成员和成员修饰符. 今天‘三’这个数字好亲和~~~类成员可以分为三类:字段.方法和属性 一.字段 首先我们来看看字 ...

  5. 【Python】类和对象、继承、使用文件、存储、异常、标准库(不懂)

    当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self ...

  6. 搞懂Python的类和对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 ...

  7. Python深入类和对象

    一. 鸭子类型和多态 1.什么是鸭子类型: 在程序设计中,鸭子类型(英语:Duck typing)是动态类型和某些静态语言的一种对象推断风格."鸭子类型"像多态一样工作,但是没有继 ...

  8. python的类和对象

    一.面向对象和面向过程 1.1面向过程的特点 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 1.2面 ...

  9. python 2 类与对象

    1.类与对象的概念 类即类别.种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体. 那么问题来了,先有的一个个具体存在的对象(比如一 ...

随机推荐

  1. Call to undefined function mysqli_connect() in xx.连接数据库出现mysqli_connect()未定义的问题。

    这个是我在执行php代码的时候出现的一个错误,我在网上查了好久,也按照网上常用的方法去修改,都没有效果. 例如:1.新建一个php文件: <?php print phpinfo(); ?> ...

  2. 【C#】#100 调用摄像头

    需求:由于项目需要获得用户的头像,所以需要用C#调用摄像头获取头像. 下面写一个调用摄像头的方法 案例:调用摄像头的一个DEMO[效果图] 使用的类库:AForge.dll   [Demo下载,Dem ...

  3. app数据加密方法

    由于项目涉及到注册和登录,所以我了解一下现在app使用比较广泛的几种密码加密方法,可以当作参考,以下都是在python3.5的环境下使用这些算法的例子. 1.base64 Base64是一种基于64个 ...

  4. apt-spy来获得适合自己的源,适用于UBUNTU/Debian

    使用ubuntu和debian等使用APT源的系统,有些时候是不是会不知道哪里有源,哪里的源比较快让自己的宽带完全利用,我们可以用apt-spy来自动找到 apt-spy -d unstable -a ...

  5. Git操作(基础篇)

    Git操作(基础篇) Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git的读音为/gɪt/.Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...

  6. Java虚拟机16:Java内存模型

    什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致 ...

  7. mysql报错:/usr/sbin/mysqld:unknown variable 'default-character-set=utf8'

    修改mysql的字符集时,为了将默认字符集设置为utf-8,便将/etc/my.cnf下[mysqld]加了一行 default-character-set=utf8, 但是在下次启动系统的时候,my ...

  8. h5py

    解决办法: sudo apt-get install libhdf5-dev sudo apt-get install python-h5py

  9. Python+django+uWSGI+Nginx

    Python3.5+Django+uWSGI 安装Django pip3.5 install django 安装 uWSGI pip install uwsgi 新建 django_wsgi.py # ...

  10. 分别编写两个类Point2D,Point3D来表示二维空间和三维空间的点,使之满足下列要求:

    (1) Point2D有两个整型成员变量x, y (分别为二维空间的X,Y方向坐标),Point2D的构造方法要实现对其成员变量x, y的初始化. (2)Point2D有一个void型成员方法offs ...