关于类
的理解:读《编程小白的python入门书》
- 1 起点:定义一个类
- 2 将类具体到个体:类的实例化
- 3 个体属于类,但也有自己的个性:实例属性
- 4 实例方法
- 4.1 参数self
- 4.2 更多参数
- 4.3 魔法方法__init__()
1 起点:定义一个类
类
是有一些系列有共同特征和行为事物的 抽象概念 的总和。
我们以可乐为例,可乐是一个类。
对于可乐来讲,只要是同一个品牌的可乐,他们就有着同样的成分,这被称之为配方(formula)。就像是工厂进行批量生产时所遵循的统一标准,正是因为有着同样的配方,所有可口可乐才能达到一样的口味。
下面用 Python中的类来表达这件事:
class Cocacola:
formula = ['caffeine','sugar','water','soda']
上述代码中 Cocacola
是一个类,formula
被称为 类的属性(class attribute)
。
2 将类具体到个体:类的实例化
按照formula配方生产可乐,无论多少,所有生产出的可乐味道都相同。
coke_for_me = Cocacola()
coke_for_you = Cocacola()
#我的可乐是可口可乐
#左边是创建的变量,右边是类的名称,这种形式与赋值类似,称之为 `实例化`。实例化后的对象(变量)就是`实例`。
对于可乐而言,按配方把可乐生产出来的过程就是实例化的过程,一瓶可乐就是一个实例。
print(Cocacola.formula)
print(coke_for_me.formula)
print(coke_for_you.formula)
在类的名称后输入.
,IDE会自动联想之前定义过的属性。这就是类属性的引用。
类的属性会被所有类的实例共享。
#运行结果:
>>>['caffeine','sugar','water','soda']
>>>['caffeine','sugar','water','soda']
>>>['caffeine','sugar','water','soda']
3 个体属于类,但也有自己的个性:实例属性
对于Cocacola,起一个中文名“可口可乐”很适合本土化推广。
class Cocacola:
formula = ['caffeine','sugar','water','soda']
coke_for_China = Cocacola()
coke_for_China.local_logo = '可口可乐' #创建实例属性
print(coke_for_China.local_logo) #打印实例属性引用结果
>>> 可口可乐
上述coke_for_China.local_logo
的形式可以总结为object.new_attr
。在这个过程中 实例-可乐 产生了除formula
外的新属性local_logo
,称之为实例属性(instance attribute)
。
在这里应注意:
coke_for_me.formula #引用类属性
coke_for_China.local_logo #引用实例属性
两者引用形式相同,但本质上却很大不同。
4 实例方法
类的实例可以引用属性(coke_for_me.formula),类的实例还可以使用方法。方法即函数,但我们把这个函数(function)称之为方法(method)。
可乐具有解渴的功能(function),用类来表示可乐的功能:
class Cocacola:
formula = ['caffeine','sugar','water','soda']
def drink(self):#此处的self指的是下面的实例coke
print('Energy')
coke = Cocacola()
coke.drink()
>>> Energy
4.1 参数self
上面代码中出现了self
。
这个参数(self)所代表的其实是被创建的实例(coke)。
一旦一个类被实例化,使用method的方式就像在普通情况下使用function的方式一样。
即函数的使用办法:将一个个对象作为参数放入函数括号内。如下:
coke = Cocacola
coke.drink() = Cocacola.drink(coke)
左右两边的写法完全一致。被实例化的对象会被编译器默默地传入后面方法的括号中,作为第一个参数。通常我们更多地会写成=
左边那种形式。
self 这个参数名称可以随意修改,编译器井不会因此而报错,但是按照 Python的规矩,我们还是统一使用self。
4.2 更多参数
像函数一样,类的方法也能有属于自己的参数。
class Cocacola:
formula = ['caffeine','sugar','water','soda']
def drink(self,how_much):
if how_much == 'a sip':
print('COOL')
elif how_much == 'whole bottle'
print('Headache')
ice_coke = Cocacola()
ice_coke.drink('a sip')
>>> COOL
4.3 魔法方法__init__()
Python的类中存在一些方法,被称“魔术方法”。__init__()
就是其中之一。 __init__()
的神奇之处就在于,如果在类里定义了它,在创建实例的时候它会自动地处理很多事情——比如新增实例属性。
在之前的代码中,我们创建了一个实例属性,但那是在定义完类之后再做的,这次我们一步到位:
class Cocacola:
formula = ['caffeine','sugar','water','soda']
def __init__(self):#原先是在class外面,创建实例,之后再对实例添加属性
self.local_logo = '可口可乐'#这里直接在类内对所有创建出的实例预设了属性
def drink(self):#此处的self指的是下面的实例coke
print('Energy')
coke = Cocacola()
print(coke.local_logo)
>>> Energy
其实__init__()
是 Initialize(初始化)的缩写,这也就意味着即使我们在创建实例的时候不去引用__init__()
方法,其中的命令也会先被自动地执行,是不是感觉像变魔术一样? __init__()
方法可以给类的使用提供了极大的灵活性,试试下面代码:
class Cocacola:
formula = ['caffeine','sugar','water','soda']
def __init__(self):
for element in self.formula:
print('Coke has {}!'.format(element))
def drink(self):
print('Energy')
coke = Cocacola()
打印结果
>>> Coke has caffeine!
>>> Coke has sugar!
>>> Coke has water!
>>> Coke has soda!