大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
类,class,用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
成都创新互联科技有限公司专业互联网基础服务商,为您提供西部信息服务器租用,高防物理服务器租用,成都IDC机房托管,成都主机托管等互联网服务。
函数,是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
python语言中类和函数的区别是什么?
1、规则不同
类是一种引用数据类型,类似于byte、short、int(char)、long、float、double等基本数据类型;
函数必须声明后才可以被调用,调用格式为:函数名(实参)调用时函数名后的小括号中的实参必须和声明函数时的函数括号中的形参个数相同。
2、主体不同
类是面向对象程序设计实现信息封装的基础;
函数是指一段在一起的、可以做某一件事的子程序。
3、特点不同
类是一种用户定义的引用数据类型,也称类类型,每个类包含数据说明和一组操作数据或者传递消息的函数,类的实例称为对象;
函数分为全局函数、全局静态函数,在类中还可以定义构造函数、析构函数、拷贝构造函数、成员函数、友元函数、运算符重载函数、内联函数等。
首先来看一个函数间的调用
类方法:
执行结果:
metaclass能有什么用处,先来个感性的认识:
1.1 在wiki上面,metaclass是这样定义的:In object-oriented programming,
a metaclass is a class whose instances are classes.
Just as an ordinary class defines the behavior of certain objects,
a metaclass defines the behavior of certain classes and their instances.
也就是说metaclass的实例化结果是类,而class实例化的结果是instance。我是这么理解的:
metaclass是类似创建类的模板,所有的类都是通过他来create的(调用 new ),这使得你可以自由的控制
创建类的那个过程,实现你所需要的功能。
当然你也可以用函数的方式(下文会讲)
4.1 用类的形式
4.1.1 类继承于type, 例如: class Meta(type):pass
4.1.2 将需要使用metaclass来构建class的类的 metaclass 属性(不需要显示声明,直接有的了)赋值为Meta(继承于type的类)
4.2 用函数的形式
4.2.1 构建一个函数,例如叫metaclass_new, 需要3个参数:name, bases, attrs,
name: 类的名字
bases: 基类,通常是tuple类型
attrs: dict类型,就是类的属性或者函数
4.2.2 将需要使用metaclass来构建class的类的 metaclass 属性(不需要显示声明,直接有的了)赋值为函数metaclas_new
5.1 basic
metaclass的原理其实是这样的:当定义好类之后,创建类的时候其实是调用了type的 new 方法为这个类分配内存空间,创建
好了之后再调用type的 init 方法初始化(做一些赋值等)。所以metaclass的所有magic其实就在于这个 new 方法里面了。
说说这个方法: new (cls, name, bases, attrs)
cls: 将要创建的类,类似与self,但是self指向的是instance,而这里cls指向的是class
name: 类的名字,也就是我们通常用类名. name 获取的。
bases: 基类
attrs: 属性的dict。dict的内容可以是变量(类属性),也可以是函数(类方法)。
所以在创建类的过程,我们可以在这个函数里面修改name,bases,attrs的值来自由的达到我们的功能。这里常用的配合方法是
getattr和setattr(just an advice)
下面实现python中在一个类中调用另一个类的函数方法
或者下面来一个号理解的例子
执行结果:
先来介绍内部类与外部类是什么?
看源码解析:
内部类调用外部类的类属性和类方法
参考文献1
参考文献2
参考文献3
额,类主要是为了数据封装,隐藏细节,再加上类对多态,继承的支持,可以更好地运用设计模式等设计方法。
例子嘛。。。
你说的应该是函数式编程和面向对象编程的区别~~~
就像c语言和c++的区别一样~
使用c也可以做面向对象编程,比如结构体中封装数据,使用函数指针封装方法,但是这种“伪装”有时候并不直观~~ 所以才有从语法层面支持面向对象的语言~~
不知道我说没说到点子上。
详细的来说,如果只是简单的脚本,过程式没问题~~
但是如果是复杂的系统,比如万行以上的系统,不使用面向对象的设计方法,是很容易失控的~~
优点:可以保存状态
缺点:可以保存状态
解释:
如果不能保存状态,那么每次调用函数时,你都不得不把相关信息通过参数传递过来,麻烦并且在参数多时容易出错。
当一个东西包含状态,意味着很多操作会带有修改其内部状态的副作用。当项目管理不善时,某些对象的内部状态可能多且关系错综复杂,会给维护和调试带来极大的复杂度。也就是稍微改一下,很多东西就出奇怪的问题。
另一方面,将逻辑、算法与状态绑定,会使其不够灵活。比如用着用着,你有多种状态都需要同一种处理逻辑,这时候再把逻辑和算法从类里抽出来就麻烦了。
当然也有纯数据的不可变的类,比如各种 named tuple、datetime 之类的(函数本身就是个类)。函数里也可以通过操作闭包或者全局变量来保存状态。我只是说普通用户所遇到的大部分情况。
推荐策略:举棋不定时听 pylint 的话。