day08

上一篇写了面向对象编程,今天的内容就是类中的几个重要的概念:类属性,类方法,实例属性,实例方法,静态方法。
这几个概念之所以要单独用一篇来说,是因为他们很重要而且需要学习python这门语言的人必须弄清楚才行,不然在使用面向对象编程的时候就会出错。

我把他们分了组:类属性和类方法为一组,实例属性和实例方法是一组,静态方法单独一组,或许这样可以方便记忆
用几句代码来表示这几种方法分别在类中的哪里。如下:

用面向对象的思想创建一个类:
	class a(obj):
		b='这是类属性'
		def __init__(self):
			self.c=‘这是实例属性’
		def d(self):
			print('这是实例方法内的语句') 
		@classmathod
		def e(cls):
			print('这是类方法中的语句')
		@startmathod
		def f():
			print('这是静态方法中的语句')

上面的代码中,__init__方法是不是有点眼熟?上一篇我们介绍了这中以双下划线开头,双下划线结尾的方法是魔法方法,每个魔法方法都有它的作用,在这里,__init__这个魔法方法的作用是初始化,怎么理解呢?相当于我们用这个类创建的每一个实例,都有这个方法里面的东西,而且我们一般在这个方法里面放入变量,也就是属性,那么就可以这么说,__init__方法中的属性,就叫做实例属性。
b这个变量位于__init__之外,所以b变量就不是实例属性,既然不是实例属性,而又是一个变量,那么,这个东西就肯定是类属性啦。就是我们创建的这个类名所拥有的属性。如果我们用这个类创建很多很多个实例,那么,每个实例都拥有这个类属性,并且都是一样的。你可能会疑惑,那么上面的__init__中的实例属性在不同的实例中会不一样吗?那是肯定有可能不一样的啦,而且大多数时候都是不一样的,一不一样要取决于我们创建实例时,要不要给他传递一样的参数。
d函数是一个正常的不带下划线的函数,这种函数在类中就是实例方法了。实例方法第一个参数必须传入一个参数,我们一般都命名为self,当然也可以自己自定义名字,但是我们都不建议自定义名字,最好就叫self,这样好记,好用,好理解,self代表的就是他自己,就是每个实例本身,我们在__init__中的self.c的值,就是赋予给每个不用的实例的属性。
@classmathod是一个装饰器,装饰器我们前面说过了,就不说了,在这里,这个装饰器的作用就是把被装饰函数变成类方法,其内部如何实现我也不知道,毕竟我也没有去研究过,将来也许回去深入学习。目前只知道它的作用,能用就行。类方法的第一个参数必须传入cls。类方法的特点是不能访问实力属性和实例方法,只能访问类属性。
@startmathod也是一个装饰器,如上面的类装饰器一样,作用是将一个函数变成静态方法,既然叫静态方法,还放在类里面,一定有特殊的地方,它的特点就是不能访问实例属性和实例方法,只能访问类属性。不能传入self参数

总结:
1.类属性与类方法是类固有的属性和方法,不会因为实例的改变而变化,且用该类创建的每一个实例,都拥有相同的类属性和类方法。
2.静态方法不能使用实例属性和实例方法,可以使用类属性,不能传self,可以用类名和实例名在外部调用
3.类方法不能使用实例属性和实例方法,能用类属性,需要传入cls参数,可以用类名和实例名在外部调用
4.实例方法可以使用实例属性和类属性,必须传入self参数,可以用实例名在外部调用。

其实类方法和静态方法在实际使用的时候用的相对较少,不过也是需要知道的。

下面这个要讲的是实例对类属性的影响 (重要)
实例是可以调用类属性的,但是能不能改变类属性呢?
实际上,这要看类属性是不是一个可变类型的数据。
如果类属性是一个不可变的类型的数据,如字符串,数字等,那么用实例名.类属性这种调用方式重新给类属性赋值,是无法改变类属性的,我们这样赋值,其实是在实例所在的空间内创建了一个和类属性名相同的属性,不过这个新创建的属性是属于实例的,跟类没有半毛钱关系,类中的属性还是在那里,没有改变,我们用id()函数查看这两个属性的内存地址就知道这两个相同名字的变量的内存地址是不一样的。
但是如果类属性是一个可变的类型的数据,如列表,字典等,那么用实例名.类属性这种调用方式来改变可变类属性内部的元素,是可以做到的,如增加,删除,修改等,都可以改变类属性,但是一旦用某一个实例改变了类属性,那么相应的,用这个类创建的所有的实例的这个类属性都会被改变,无论是在改变之前创建的实例还是改变之后创建的实例,通通都要变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值