python笔记:Class(类)

在学习python代码中,你是否看到过Class这个词?你是否见过__init__这样的代码?有的书里把这部分内容讲的太过“专业”,导致我看了也看不懂。直到看Python Crash Course这本书关于这部分讲解,才明白什么是Class。其实如果之前的function能理解的话,学习Class也不是非常难。这篇笔记就是记录有关class的基础结构和基本的使用(更多内容请阅读该书第九章)

你可以使用“类”为任何东西建立模型。让我们从编写一个简单的“类”开始,这个类的名字叫Dog,它表示一条狗——不是特定的一条狗,而是任意一条狗。对大多数宠物狗他们都有名字和年龄。我们还知道,大多数狗都会坐着和打滚。这两条信息(name和age)和这两种行为(sit和roll over)将在这个例子里,因为它们对大多数狗来说都很常见。这个类将告诉Python如何创建一个表示狗的对象。编写完类之后,我们将使用它来创建单独的实例(instance),每个实例代表一个特定的dog。

(一)创建一个class

从类创建的每个实例将存储一个名称name和一个年龄age,我们将给每只狗提供sit()和roll_over():

1)  class Dog:
2)      """A simple attempt to model a dog."""

3)     def __init__(self, name, age):
         """Initialize name and age attributes."""
4)         self.name = name
           self.age = age
        
5)     def sit(self):
          """Simulate a dog sitting in response to a command."""
          print(f"{self.name} is now sitting.")

       def roll_over(self):    
          """Simulate rolling over in response to a command."""
          print(f"{self.name} rolled over!")

在1)处,我们定义了一个名为Dog的类。按照惯例,大写的名称在Python中指代类。在类定义中没有括号,因为我们是从头创建这个类。在2)处,我们写一个文档字符串(docstring)来描述这个类做什么。

(1) __init__ ()方法

作为类的一部分的function就是方法(method)。你学过的function知识也适用于方法。目前唯一的实际区别是我们调用方法的方式。在3)处的__init__()方法是一个特殊的method,每当我们基于Dog类创建一个新实例时,Python都会自动运行该方法。这个方法有两个前导下划线和两个后置下划线,这个惯例有助于防止Python的默认方法名与method名冲突。请确保在__init__()的两边都使用两个下划线。我们定义__init__()方法有三个参数:selfnameageself参数在方法定义中是必需的,而且它必须在其他参数之前出现。它必须包含在定义中,因为当Python在稍后调用该方法(创建Dog实例)时,将自动传递self参数。每个与实例关联的方法调用都会自动传递self。当创建Dog的实例时,Python将从Dog类调用__init__()方法。将name和age作为参数传递给Dog(),self会自动传递,所以我们不需要传递它。每当我们想要从Dog类创建一个实例时,我们只需提供最后两个参数的值,name和age。

在4)处定义的两个变量都有前缀self。任何带self前缀的变量都可以用于类中的每个方法,而且我们还能够通过从类创建的任何实例访问这些变量。self.name = name接受与参数名相关联的值,并将其赋值给变量名,然后将变量名附加到正在创建的实例上。self.age = age也是一样的。可以通过这样的实例访问的变量称为属性(attributes)。

在5)处,这个Dog类还定义了另外两个方法:sit()和roll_over() 。因为这些方法不需要额外的信息来运行,所以我们定义它们只有一个参数self。我们稍后创建的实例能够访问这些方法。目前,sit()和roll_over()只是打印信息。但是这个概念可以扩展到现实情况:如果这个类是一个真实的电脑游戏的一部分,那么这些方法将包含让动画狗坐下和翻滚的代码。

(二)从class里创建一个实例

可以将类看作是一组关于如何创建实例的指令。Dog类是一组指令,告诉Python如何创建代表特定狗的单个实例。

让我们用一个实例来代表一只特定的狗(实际上就是指定参数的值,并且调用methods):

my_dog = Dog('Willie', 6)

print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")

我们在这里使用的Dog类是我们在上面刚刚编写的类(class)。这里,我们告诉python创建一只名叫“Willie”的6岁狗。当Python读取这一行时,它调用Dog中的__init__()方法,参数为'Willie'和6。__init__()方法创建一个表示这只特定狗的实例,并使用我们提供的值设置nameage属性。然后Python返回一个表示这条狗的实例。我们将该实例赋值给变量my_dog。这里的命名的惯例很有帮助:我们通常可以假设大写的名字(如Dog)指的是一个类,小写的名字(如my_dog)指的是从一个类创建的单个实例。

运行后的结果:

My dog's name is Willie.
My dog is 6 years old.
(1)访问attributes

如果你要访问一个实例里的attributes,在上面的例子里就是nameage

my_dog.name

得到的结果是:

'Willie'

点符号在Python中经常使用。这个语法演示了Python如何查找属性的值。在这里,Python查看my_dog实例,然后找到与my_dog相关联的属性名。这个属性与Dog类中的self.name相同。

(2)调用methods

在创建了一个实例后,我们可以使用点符号来调用Dog类里的任何methods:

my_dog.sit()
my_dog.roll_over()

要调用一个方法,请给出实例的名称(在本例中为my_dog)和你想要调用的方法,并用点分隔。当Python读取my_dog.sit()时,它在Dog类中寻找sit()方法并运行该代码。Python以同样的方式解释my_dog.roll_over()行。

所以运行后的结果是:

Willie is now sitting.
Willie rolled over!
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容