创建类

类的定义以关键字class开头,之后跟着一个名字(用户定义)来标识这个类,并且以冒号结尾。类的内容以缩进(4个空格)表示,如下例的pass表示什么事情也不做。

Python命名规则(以字母或者下划线开头,名字只能含有字母、下划线或者数字)。一般使用驼峰式命名(以大写字母开头,并且随后紧跟的任意个单词,这些单词都要以大写字母开头)。

class MyFirstClass:
pass

将上述的代码保存为first_class.py文件,然后运行命令python -i first_class.py。参数-i表示在交互式解释器运行这个脚本。

$ python -i first_class.py
>>> a = MyFirstClass()
>>> print(a)
<__main__.MyFirstClass object at 0x103fd7e80>
>>> b = MyFirstClass()
>>> print(b)
<__main__.MyFirstClass object at 0x103fd7eb8>

上述实例化了两个对象a和b。键入类的名字并紧跟一对小括号。

添加属性

可以通过点记法给一个实例化的对象赋予任意属性,点记法形式为<object>.<attribute> = <value>来为属性赋值,这个值可以是任意的,如python内置的数据类型、其他的对象甚至是一个函数或者是另一个类。

class Point:
pass p1 = Point()
p2 = Point() p1.x = 5
p1.y = 4 p2.x = 3
p2.y = 6 print(p1.x, p1.y)
print(p2.x, p2.y)

这段代码创建了一个没有任何数据和行为的Point 类。然后创建了这个Point类的两个实例,并且给每个实例赋予一个x坐标和一个y坐标。运行如上的代码会得到如下的结果。

5 4
3 6

让类实际做一些事情

上面我们已经可以让一个对象带有属性,接下来是通过激发一些行为来引起这些属性的变化。在Point类里面添加了一个reset方法,该方法是将点移到原点(该方法不需要用到参数,是个很好的例子)。

class Point:
def reset(self):
self.x = 0
self.y = 0 p = Point() p.x = 5
p.y = 4
print(p.x, p.y)
# 5 4 p.reset()
print(p.x, p.y)
# 0 0

python中的方法(method)定义和函数(function)基本相同,方法可以操作对象本身和任意传入的参数。方法与函数不同的是,所有的方法都有一个必须的参数,这个参数通常被称为self,若忘记,引用该方法时会出现报错。一个方法中的self参数,是对调用这个方法的对象的一个引用,我们可以和其他对象一样访问这个对象的属性和方法。当要改变self对象的x和y属性值时,通过调用内部的reset方法实现。

当调用p.reset(),并没有给它传入self参数,python会自动将这个对象传给了该方法。

方法只是一个函数而已,只不过恰巧出现在类中。除了可以直接调用一个对象的方法以外,我们也可以在类中调用这个函数,并且明确可以将这个对象作为self参数传给对象。

class Point:
def reset(self):
self.x = 0
self.y = 0 p = Point()
Point.reset(p)
print(p.x, p.y)
# 0 0

如何传递多个参数?假设在Point类中,添加新的方法,可以将点移动到任意位置,而不只是原点。另外可以接受另一个Point对象作为输入,然后返回这两个对象之间的距离。

import math

class Point:
def move(self, x, y): # 接受x和y两个参数,并且给self对象赋值
self.x = x
self.y = y def reset(self): # 移动到特定位置的move
self.move(0, 0) # 接受另一个Point对象作为输入,返回距离
def calculate_distance(self, other_point):
return math.sqrt(
(self.x - other_point.x) ** 2 +
(self.y - other_point.y) ** 2) # 如何使用它
point1 = Point()
point2 = Point() point1.reset()
point2.move(5, 0)
print(point2.calculate_distance(point1))
#5.0 #assert是一个简单的测试工具,如果后面的语句是False(0,空或者None),这个程序会异常退出
assert(point2.calculate_distance(point1) ==
point1.calculate_distance(point2)) point1.move(3, 4)
print(point1.calculate_distance(point2))
#4.472135955
print(point1.calculate_distance(point1))
#0.0

参考:

1、《Python3 面向对象编程》 [加]Dusty Philips 著

Python对象的创建和赋值的更多相关文章

  1. 关于 Python 对象拷贝的那点事?

    概述 在本篇文章中,会先介绍 Python 中对象的基础概念,之后会提到对象的深浅拷贝以及区别.在阅读后,应该掌握如下的内容: 理解变量.引用和对象的关系 理解 Python 对象中 identity ...

  2. python对象初始化

    当python对象被创建以后,需要将对象进行初始化.Python有一个构造函数和一个初始化函数: 1.构造函数__new__,只接受一个参数,即类本身(它会在对象被构造之前调用,所以这里也就没有sel ...

  3. python 对象/变量&赋值的几点思考

    python 对象/变量 对象 Every object has an identity, a type and a value. An object's identity never changes ...

  4. Python比较操作符、变量赋值、对象拷贝

    Python比较操作符.变量赋值.对象拷贝 目录 Python比较操作符.变量赋值.对象拷贝 1. 比较操作符 == 和 is 1.1 区别 1.2 实例 2. 变量及其赋值 2.1 概念和逻辑关系 ...

  5. call by value reference name python既不是按值传递也不是按引用传递 python复制原理 创建新对象 与 改变原对象

    按名调用 Algol 按值调用 Java https://docs.python.org/3.6/faq/programming.html#how-do-i-write-a-function-with ...

  6. Python - 对象赋值、浅拷贝、深拷贝的区别

    前言 Python 中不存在值传递,一切传递的都是对象的引用,也可以认为是传址 这里会讲三个概念:对象赋值.浅拷贝.深拷贝 名词解释 变量:存储对象的引用 对象:会被分配一块内存,存储实际的数据,比如 ...

  7. javascript性能优化之使用对象、数组直接量代替典型的对象创建和赋值

    1.典型的对象创建和赋值操作代码示例 var myObject = new Object(); myObject.name = "Nicholas"; myObject.count ...

  8. Java创建List、Map等集合对象的同时进行赋值操作

    title: Java创建List.Map等集合对象的同时进行赋值操作 date: 2019-11-28 23:25:47 tags: JavaSE categories: JavaSE 问题简介   ...

  9. Java初学者作业——完成对已定义类(Admin)的对象的创建。并完成属性的赋值和方法的调用。

    返回本章节 返回作业目录 需求说明: 完成对已定义类(Admin)的对象的创建.并完成属性的赋值和方法的调用. 实现思路: 创建 MyTest 类,并添加 main函数. 在 main函数中完成对 A ...

随机推荐

  1. Zero to Build: Create new Xamarin apps in minutes with AppMap

    Creating a new Xamarin.Forms app can be an intimidating task, especially if you add in content pages ...

  2. 51nod-1445-变色DNA(最短路)

    题意:题目是说从0到n-1,我还是习惯从1到n,所以以下我都这么写,大概题意就是(i, j)==‘Y’表示可以从i颜色变成j颜色,然后问我们最少删除几个会影响结果的‘Y’,能到n这个颜色: 没有意义的 ...

  3. xshell使用rz/sz完成文件上传下载

    yum -y install lrzsz 安装lrzsz 使用rz完成文件上传 使用sz完成文件下载

  4. 扫描某目录下的所有文件的MD5码并导出文件【可执行jar】

    pom <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:// ...

  5. C Looooops POJ - 2115 (exgcd)

    一个编译器之谜:我们被给了一段C++语言风格的循环 for(int i=A;i!=B;i+=C) 内容; 其中所有数都是k位二进制数,即所有数时膜2^k意义下的.我们的目标时球出 内容 被执行了多少次 ...

  6. project 2013 显示标题

    1.分析 右键只能插入任务,不能插入标题,而插入任务会被编号,目前只能在打印设置标题,不能在编辑界面显示标题的,或者使用最高级任务的方式 2.解决 文件,打印,页面设置,页眉,居中,输入标题,这样打印 ...

  7. Hdoj 4508.湫湫系列故事——减肥记I 题解

    Problem Description 对于吃货来说,过年最幸福的事就是吃了,没有之一! 但是对于女生来说,卡路里(热量)是天敌啊! 资深美女湫湫深谙"胖来如山倒,胖去如抽丝"的道 ...

  8. 【CF1097F】Alex and a TV Show(bitset)

    [CF1097F]Alex and a TV Show(bitset) 题面 洛谷 CF 题解 首先模\(2\)意义下用\(bitset\)很明显了. 那么问题在于怎么处理那个\(gcd\)操作. 然 ...

  9. [WC2008]游览计划 解题报告

    [WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...

  10. 合法括号序列(dp+组合数学)

    键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字符串恰好一个合法的括号序列. 每按一次左括号(,字符串末尾追加一个左括号( 每按一次右括号),字符串末尾追加一个右括号 ...