您的位置:

python中cls对象,python的cls和self

本文目录一览:

python类中self参数和cls参数

self:表示一个类的实例对象本身

输出:

a .fun_one() = A .fun_one( a ) 二者是等价的;

cls :所指的就是这个类本身

python中cls关键字

类内有三种方法

@staticmethod

def func1(num)

def func2(self, num)

@classmethod

def func3(cls, num)

静态成员方法func1和普通成员方法func2的区别是,静态成员方法可以不实例化,直接被类名+方法名调用;普通成员方法必须被实例化之后的对象调用。

静态成员方法func1和类成员方法func3的相同点是二者都可以直接通过类名+方法名的方式调用,不同点是可以func3通过cls.func2()在func3内部调用func2,但是func1中不能调用func2,func1只能得到类的属性。

python中的cls到底指的是什么,与self有什么区别

一般来说,在Python中,类实例属性的访问规则算是比较直观的。

但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此。

在这里,我们需要明白以下几个地方:

1.Python是一门动态语言,任何实体都可以动态地添加或删除属性。

2.一个类定义了一个作用域。

3.类实例也引入了一个作用域,这与相应类定义的作用域不同。

4.在类实例中查找属性的时候,首先在实例自己的作用域中查找,如果没有找到,则再在类定义的作用域中查找。

5.在对类实例属性进行赋值的时候,实际上会在类实例定义的作用域中添加一个属性(如果还不存在的话),并不会影响到相应类中定义的同名属性。

下面看一个例子,加深对上述几点的理解:

复制代码

代码如下:

class A:

cls_i = 0

cls_j

= {}

def __init__(self):

self.instance_i =

self.instance_j =

{}

在这里,我们先定义类A的一个实例a,然后再看看类A的作用域和实例a的作用域中分别有什么:

复制代码

代码如下:

a = A()

a.__dict__

{'instance_j': {}, 'instance_i': 0}

A.__dict__

{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {},

'__doc__': None}

我们看到,a的作用域中有instance_i和instance_j,A的作用域中有cls_i和cls_j。

我们再来看看名字查找是如何发生的:

复制代码

代码如下:

a.cls_i

a.instance_i

在查找cls_i的时候,实例a的作用域中是没有它的,却在A的作用域中找到了它;在查找instance_i的时候,直接可在a的作用域中找到它。

如果我们企图通过实例a来修改cls_i的值,那会怎样呢:

复制代码

代码如下:

a.cls_i = 1

a.__dict__

{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}

A.__dict__

{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {},

'__doc__': None}

我们可以看到,a的作用域中多了一个cls_i属性,其值为1;同时,我们也注意到A作用域中的cls_i属性的值仍然为0;在这里,我们其实是增加了一个实例属性,并没有修改到类属性。

如果我们通过实例a操纵cls_j中的数据(注意不是cls_j本身),又会怎么样呢:

复制代码

代码如下:

a.cls_j['a'] =

'a'

a.__dict__

{'instance_j': {}, 'cls_i': 1, 'instance_i':

0}

A.__dict__

{'__init__': , '__module__': '__main__',

'cls_i': 0, 'cls_j': {'a': 'a'}, '__doc__': None}

我们可以看到a的作用域没有发生什么变化,但是A的作用域发生了一些变化,cls_j中的数据发生了变化。

实例的作用域发生变化,并不会影响到该类的其它实例,但是类的作用域发生变化,则会影响到该类的所有实例,包括在这之前创建的实例:

复制代码

代码如下:

A.cls_k = 0

Python 面试高频问题:cls到底是什么

上一篇文章介绍了什么是python 中的self,详情请参考:

Python面试高频问题:self到底是什么

简单的说self是类(Class)实例化的对象。

面试中还有一个问题经常被提及,那就是——什么是cls呢?

cls 是类(或子类)本身,取决于调用的是哪个类。

看下面的实例

输出:

我们也可以通过实例的方法调用class method,例如:

同样输出

输出:

使用cls 作为方法参数时,通常该方法需要由@classmethod 修饰,@classmethod修饰的方法表示的是类方法。这里需要注意cls就是一个标识,你可以把他写成abc,bcd都是可以的,只是出于习惯写成了cls。

既然cls是一个类,那么我们就可以使用他来进行实例化,具体代码如下:

输出:

可以看到通过obj1=cls()和obj2=cls(),成功创建了两个实例,分别是0x000000690A1E0C08和0x000000690A1E0C48,而这两个实例的类型都是MyClass3'

另外cls 还可以在python类中的方法 __new__里实现,通常定义为:

最后我们可以简单地总结一下self 和 cls:简单的说self是类(Class)实例化的对象。

cls 是类(或子类)本身。我们也可以方便地理解self表示实例的,cls则表示类的!

什么时候使用python类cls方法

cls是class的缩写。

class A:

member = "this is a test."

def __init__(self):

pass

@classmethod

def Print1(cls):

#杩欎釜鏄被鏂规硶

print "print 1: ", cls.member

def Print2(self):

print "print 2: ", self.member

@classmethod

def Print3(paraTest):

print "print 3: ", paraTest.member

a = A()

A.Print1() #相当于Print1(A)

a.Print2() #相当于Print2(a), 请注意@classmethod

A.Print3()

可以看出来,python在通过“.”调用成员函数的时候,会将“.”前面的东西当作函数的第一个参数调用。

而且pyhon并不关心我们把类的成员函数的第一个参数的名称是什么,我们可以用任意的名称,可以看Print3的定义就知道了。