目录
Classes(类)
在像Python这样支持面向类的编程语言中,类被用来为可以在程序代码中执行状态和行为操作的对象创建模板。类包含采用数据属性和方法形式的属性引用。类数据属性和方法在语法上与到目前为止使用Python编写的变量和函数相同。主要的区别在于,数据属性和方法是在包含它们的类的实例上调用和操作的。
类使用类似于函数的语法声明:
class Fruit:
pass
上面的例子代表了可以在Python中创建的最简单的类。如果我们想要使用这个类,我们可以实例化或创建一个我们创建的Fruit的实例,并把它当作Python中的任何其他对象来对待:
class Fruit:
pass
fruit = Fruit()
print(fruit)
这将在Python shell中显示类似如下内容:
>>> <__main__.Fruit object at 0x7ff56b3a78e0>
Python解释器将变量fruit识别为fruit类的实例,并输出其字符串表示。当然,由于Fruit定义没有任何成员,我们还不能对它做任何事情。让我们赋予它一些目的:
class Fruit:
fruit_type:str
color:str
is_seedless:bool
condition:str
现在Fruit类有一些属性可以用来描述水果的共同特征。在类被实例化之前,它只是作为一种蓝图存在,告诉我们它应该做什么以及它应该如何工作。如果这听起来令人困惑,那么将类看作食谱,将类的实例看作它生产的可食用食物可能会有所帮助。让我们继续这个食物的比喻,使用之前代码片段中创建的Fruit蓝图来创建一些不同类型的水果:
apple = Fruit()
apple.fruit_type = "apple"
apple.color = "green"
apple.is_seedless = False
apple.condition = "ripe"
banana = Fruit()
banana.fruit_type = "banana"
banana.color = "brown"
banana.is_seedless = False
banana.condition = "rotten"
print(apple)
print(banana)
当运行时,代码片段底部的print语句将在Python shell中显示以下内容:
<__main__.Fruit object at 0x7f6f9366b880>
<__main__.Fruit object at 0x7f6f9366add0>
注意,这两个变量的类型是相同的:Fruit,但是Python解释器使用的字符串表示是不同的。这告诉我们,尽管这两个对象都是Fruit的实例,但它们不是同一个对象。这是使类在Python中有用的特性之一。我们可以根据自己确定的规则创建自己的类型。
到目前为止,Fruit类只被编写用来保存一些简单的属性。这些属性的值是任意的。因为它们大多是string类型,所以可以将它们设置为我们想要的任何字符串值。例如:
banana = Fruit()
banana.condition = "sick"
即使上面的代码片段在编程上是有效的,它也没有多大意义,对吗?如果我们希望这个类被其他程序员使用,或者确保我们总是正确地使用它,我们应该锁定class属性条件的可用选项。完成这个任务的方法有很多种,但我们在这节课只讨论一种。我们将在本季度晚些时候的高级课程讲座中介绍其他一些内容。现在,让我们回到Fruit类:
class Fruit:
fruit_type:str
color:str
is_seedless:bool
picked_date:str
def get_condition():
condition = "unknown"
age = check_age(self.picked_date)
if age <= 4:
condition = "unripe"
elif age > 4 and age < 10:
condition = "ripe"
elif age > 10:
condition = "rotten"
return condition
我们要做的第一件事是添加一个新属性,用于存储水果的采摘日期。然后,用一个名为get_condition的方法(或类函数)替换条件属性。这种新方法现在可以控制这种水果可能出现的各种条件。我们假设有另一个可用的方法check_age,它可以根据新的pickd_date属性中存储的值计算水果的年龄。请注意,要实现check_age方法,代码片段将需要使用一个额外的模块、一些日期/时间计算,并使我们离Lecture的目标太远。让我们创建一个修改后的Fruit类的实例,并尝试新的get_condition方法:
apple = Fruit()
apple.fruit_type = "apple"
apple.color = "green"
apple.is_seedless = False
apple.picked_date = "1/17/2022"
print(apple.get_condition())
取决于你读这节课的日期,你的苹果可能是生的,成熟的,甚至可能是烂的(尽管我希望不是!)