天天看点

python 实例变量_Python的类变量和实例变量详解

python 实例变量_Python的类变量和实例变量详解

Asuka

什么是类变量?

class Student:

name = 'Asuka'

age = '18'

...

上面定义的name和age就是类变量

什么是实例变量?

class Student:

def __init__(self,name,age)

self.name = name

self.age = age

...

上面定义的name和age就是实例变量

类变量和实例变量的区别和应用

类变量为所有实例化后的类共享,有点类似继承的概念,实例化后,每个实例都会有这个属性,有种default的意味,可以设置一个带默认值的属性.

实例变量为每个实例化后的类独有,因为python类实例化之后会自动调用init方法,如果您在类里面定义了相同的属性,那么init下的实例变量会重写相同的类变量.

一般来说,我们更多的运用实例变量,因为按照严格的面向对象思想,类的所有属性都应该是实例的,类变量根本就不应该存在的,不过类变量偶尔还是有一点用处的,比如设置默认值和常量.

关于dict的说明

大家在序列化类,比如转成json格式,许多同学会想到先把类转成dict,然后再转成json.于是,同学们可能会考虑用dict.

我想告诉同学们的一句话是,使用dict方法只能序列化实例变量,无法序列化类变量.

如何写出一个优美的面向对象的类

下面这句是关键

类应该保存描述自身的特点和能够实现的行为.

1.尽量多使用实例变量,不要总想把类里面的资源return到外部

2.类下面的函数应该有操作实例变量的行为,也就是通常所说的方法

3.类里面不能只有staticmethod,classmethod这类的方法,因为这些还是面向过程的思维,不要一步步想着写方法,根本没用到自己实例的属性

4.面向对象的思维其实就是一种造物主的思维,我们思考问题的时候要有一些灵性,少了什么,我们就直接创造一个出来就行了,别和解数学题一样,总是在想求解方程中x,y,z等于什么.

如果大家有过python web编程经验的话,就和编写视图函数是一样的,我们编写视图函数的时候总是会事先假象我们有验证层,模型层,视图模型层等等分层,我们先定好整体的逻辑,事后再补齐对应层的函数,就和造物主有点类似,少了什么我们直接new一个就行了(为什么不能new一个对象出来呢?).

视图函数内部总是会实例化一些验证实例(wtforms),模型实例(sqlalchemy),业务逻辑等等内容,这些内容本来都是不存在的,都是我们在其他地方定义好的类或者函数,却直接在视图函数中用上来了.

Python 3.7的dataclass

from dataclasses import dataclass

@dataclass

class Student:

name:str

age:int

...

python 3.7版本中加了一个令人激动的dataclass装饰器,简单的实现类比上面,如果同学们比较反感编写构造函数时候要编写大量重复的代码,可以尝试下dataclass装饰器.

这个装饰器,不仅仅是简写代码,直观显示数据类型,还可以进行数据比较,创建不可变属性,使用post_init预处理变量等等好处.

如果想要更详细了解这个新功能的细节,可以看下这篇文章--->https://linux.cn/article-9974-1.html

最后的留言

如果大家有什么疑问,可以在下方留言或者私信我,看到我会回复的(就是很难及时回复了).

如果我上面说的有什么错误,欢迎大家指正我(杠起来).

这是我的个人站点——一路香蕉皮,有兴趣可以点击查看下,里面有软件,教程,图片福利分享