Python | 关于 类、实例、self、__init__ 的理解

关于的理解:读《编程小白的python入门书》

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!

猜你喜欢

转载自blog.csdn.net/yefcion/article/details/79458222