类的属性和方法的总结。
属性的特点
类属性实例对象和类对象都能用,但是之前学的,实例修改属性只对实例有效,只有类对象修改属性才对类和新实例对象(没单独修改过属性的实例)都有效。
class Shiyan():
leishuxing = 6
sy = Shiyan()
sy.leishuxing = 7
print(Shiyan.leishuxing)
print(sy.leishuxing)
Shiyan.leishuxing = 9
sy1 = Shiyan()
print(Shiyan.leishuxing)
print(sy.leishuxing)
print(sy1.leishuxing)
6
7
9
7
9
而实例对象专属于实例,类对象不能用。
class Shiyan():
leishuxing = 6
def __init__(self):
self.shilishuxing = '⑨'
print(sy.shilishuxing)
⑨
print(Shiyan.shilishuxing)
Traceback (most recent call last):
File "D:/4classcode/4classcode/lianxi.py", line 830, in <module>
print(Shiyan.shilishuxing)
AttributeError: type object 'Shiyan' has no attribute 'shilishuxing'
方法的特点
实例方法类和实例都能用。实例方法的标识就是以self为第一个形参传输的方法。但要注意,之前也讲到,实例调用方法的时候会默认将对象本身当实参传入。但是用类调用的时候不会,需要自己写,输入实参就是对象。
实例用实例方法:
class Shiyan():
leishuxing = 6
def __init__(self):
self.shilishuxing = '⑨'
def shilifangfa(self):
print('实例方法')
sy = Shiyan()
sy.shilifangfa()
实例方法
类用实例方法但不传参:
Shiyan.shilifangfa()
Traceback (most recent call last):
File "D:/4classcode/4classcode/lianxi.py", line 835, in <module>
Shiyan.shilifangfa()
TypeError: shilifangfa() missing 1 required positional argument: 'self'
类用实例方法且传参:
Shiyan.shilifangfa(sy)
实例方法
类方法需要在类里面定义,同时还要用@classmethod装饰。类方法也有一个默认传参,对应实例方法的self,在形参里面自动叫做cls。cls的类型取决于类方法在哪个类里面定义。注意类方法也是类和实例都能用,且不需要自己传实参。
class Shiyan():
leishuxing = 6
def __init__(self):
self.shilishuxing = '⑨'
def shilifangfa(self):
print('实例方法')
@classmethod
def leifangfa(cls):
print('类方法',cls)
sy = Shiyan()
Shiyan.leifangfa()
sy.leifangfa()
类方法 <class '__main__.Shiyan'>
类方法 <class '__main__.Shiyan'>
参数cls在Shiyan()类里面定义,所以是Shiyan类的对象。
静态方法是一种用@staticmethod装饰的方法,而且不需要任何的形参,不用self啊cls啊之类的。
class Shiyan():
leishuxing = 6
def __init__(self):
self.shilishuxing = '⑨'
def shilifangfa(self):
print('实例方法')
@classmethod
def leifangfa(cls):
print('类方法',cls)
@staticmethod
def jingtaifangfa():
print('静态方法')
sy = Shiyan()
Shiyan.jingtaifangfa()
sy.jingtaifangfa()
静态方法
静态方法
之前学到,函数和方法的区别就是有没有默认传参,所以从这个意义上讲,静态方法其实属于函数,基本上和类没啥关系,只是保存在这个类里面而已。有关的地方就是需要借助**.静态方法()的形式调用,而不能像函数一样直接调用**。