类是抽象的,对象是类的实例。
类(Class)由三部分构成:类名、类的属性(变量)、类的方法(函数)
(1)self和cls以及类中的函数
cls用来表示类本身
self用来表示对象(类似于c++中的this),self代表类的实例,而非类。
把self换成this,结果也一样,但Python中最好用约定俗成的self。
和普通数相比,在类中定义的函数只有一点不同,就是第一参数永远是类的本身实例变量self,并且调用时,不用传递该参数。除此之外,类的方法(函数)和普通函数没啥区别,既可以用默认参数、也可以用可变参数或者关键字参数(*args是可变参数,args接收的是一个tuple,**kw是关键字参数,kw接收的是一个dict)。
class Test:
def test1(self):
print(self)
print(self.__class__)
t = Test()
t.test1()
#从上面的例子可以看出 self代表的是类的实例。而self.__class__则指向类。
#注意:把self换成this,结果也一样,但Python中最好用约定俗成的self。
self可以不写吗?
在Python解释器的内部,当我们调用t.test1()时,实际上Python解释成Test.test1(t),也就是把self替换成了类的实例。
如果不写self,见如下示例代码,从结果可以看出,报错了。
运行时提醒错误如下:test1在定义时没有参数,但是我们运行时强行传了一个参数。
原因:t.test1()等同于Test.test1(t),所以程序提醒我们多传了一个参数t。
这里实际上已经部分说明了self在定义时不可以省略。(当然,如果我们的定义和调用时均不传类实例是可以的,下面有示例代码)
class Test:
def test1():
print('hhh')
t = Test()
t.test1() #会报错
当然,如果我们的定义和调用时均不传类实例是可以的
#当然,如果我们的定义和调用时均不传类实例是可以的
class Test:
def test1():
print(__class__)
Test.test1()
(2)__init __ 、__new __、__del __
__init __ 、__new __更多内容链接1
__init __ 、__new __更多内容链接2
__init __ 方法是Python最基本的魔术方法,通过此方法我们可以定义一个对象的初始操作,实际上它背后还有一个__new __方法。__new __是用来创建类并返回这个类的实例, 而__init __只是将传入的参数来初始化该实例。
对象生命周期调用结束时,__del __ 方法会被调用。
用于初始化(类似于构造函数):
(1)__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
(2)有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但se