Code前端首页关于Code前端联系我们

Python基础入门笔记:理解类

terry 2年前 (2023-09-25) 阅读数 48 #后端开发

理解类

5.1类简介

定义类:

class CocaCola:
    formula = ['caffeine','sugar','water','soda']
复制代码

使用

class TestA:
    attr = 1
obj_a = TestA()
obj_b = TestA()

obj_a.attr = 42
print(obj_b.attr)

>>> 结果:1
复制代码

类来定义一个类,只需def 就像定义一个函数一样简单。如上所示,可以看到定义了名为CocaCola的类,然后在缩进的地方有一个公式,其中包含变量列表。类中定义的变量就是类的变量,类的变量变量有一个专门的术语,我们称之为类的属性。

类的属性:

  • 类变量
  • 方法

①类的实例化:

coke_for_me = CocaCola()
coke_for_you = CocaCola()
复制代码

②对类变量的引用②对类变量的引用,可乐给我。使用公式

类方法:

class CocaCola:
    formula = ['caffeine','sugar','water','soda']
    def drink(self):
        print('Energy!')
coke = CocaCola()
coke.drink()
复制代码

结果:

Energy!
复制代码

5.2 self

我想很多人都会注意到这个奇怪的地方——self似乎不属于任何参数♝。我们来解释一下原理。其实很简单。让我们更改上面的代码:

class CocaCola:
    formula = ['caffeine','sugar','water','soda']
    def drink(coke):	# 把self改为coke
        print('Energy!')
coke = CocaCola()
coke.drink()
复制代码

结果:

Energy!
复制代码

我们有一些线索怎么样!该参数实际上是创建的实例本身。也就是说,对象作为参数插入到函数括号中。此外,一旦实例化了一个类,我们实际上可以像使用函数一样使用它:

coke = CocaCola
coke.drink() == CocaCola.drink(coke) #左右两边的写法完全一致
复制代码

实例化的对象将被编译。构造函数作为第一个参数默默地传递到以下方法的括号内。上面两种方法是一样的,但是我们大多会按照前面的形式来写。其实参数名self可以随意更改(编译器不会因此而报错)。

就像函数一样,类方法也可以有自己的参数,如下:

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~
复制代码

5.3 魔法方法

Python 类中有一些方法,称为“魔法方法”。 _init_()就是其中之一。

class CocaCola():
    formula = ['caffeine','sugar','water','soda']
    def __init__(self):
        self.local_logo = '可口可乐'
    def drink(self): 
        print('Energy!')
coke = CocaCola()
print(coke.local_logo)
复制代码

它的作用:它在创建实例之前做了很多事情。说白了,就是说即使你在创建实例时不引用init_()方法,里面的语句也会自动先执行。这为类的使用提供了极大的灵活性。

class CocaCola:
    formula = ['caffeine','sugar','water','soda']
    def __init__(self,logo_name):
        self.local_logo = logo_name
    def drink(self):
        print('Energy!')
coke = CocaCola('ݢݗݢԔ')
coke.local_logo
>>> 可口可乐
复制代码

如果有过面向对象编程的经验,就很容易理解,也就是很多面向对象语言中的“构造函数”。

5.4 类继承

如下代码:

class CaffeineFree(CocaCola):
    caffeine = 0
    ingredients = [
        'High Fructose Corn Syrup',
        'Carbonated Water',
        'Phosphoric Acid',
        'Natural Flavors',
        'Caramel Color',
    ]
coke_a = CaffeineFree('Cocacola-FREE')
coke_a.drink()
复制代码

表示decaf继承了CocaCola类。

类的变量和方法可以被子类继承,但如果需要特殊更改,也可以重写

Q1:如果重新分配类属性,是否会影响对该类属性的引用?

class TestA():
    attr = 1
obj_a = TestA()

TestA.attr = 24
print(obj_a.attr)

>>> 结果:24
复制代码

A1:会影响。

Q2:如果实例属性重新赋值,是否会影响对类属性的引用?

class TestA:
    attr = 1
obj_a = TestA()
obj_b = TestA()

obj_a.attr = 42
print(obj_b.attr)

>>> 结果:1
复制代码

A2:无影响。

Q.3:类属性实例属性同名,那么后面的.指的是什么呢?

class TestA():
    attr =1
    def __init__(self):
        self.attr = 24

obj_a = TestA()

print(obj_a.attr)

>>> 结果:24
复制代码

A3:分配类属性后的值。

总结:如图所示,Python中属性的引用机制是从外到内的。创建实例并准备开始引用属性后,编译器将首先检查实例是否具有该属性。如果是,则参考;如果没有,它将搜索该实例所属的类是否具有该属性。如果有的话,参考一下。如果没有,它只会报告错误。 Python基础入门笔记:类的理解

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门