1.实例方法
2.静态方法
3.类方法
4.静态属性
5.魔法方法
实例方法只能通过实例对象调用,不能通过类进行调用。实例方法再定义时候使用关键字self,self代表实例对象本身。
class A():
x=100
def fun(self,y):
self.x+=y
a=A()
a.fun(10)
print(a.x)
A.fun(10)
*****结果******
110
Traceback (most recent call last): #类调用错误
File "/home/34f17b632da0cc986bc0f291c0518783.py", line 8, in
A.fun(10)
TypeError: fun() missing 1 required positional argument: 'y'
静态方法
静态方法可以使用实例对象调用,也可以使用类进行调用,他的的特点没有参数限制,定义时需要在函数前加@staticmethod
1. 作用:静态方法可以更好的组织代码,防止代码变大后变得比较混乱。
2. 特性: 静态方法只是名义上归类管理,实际上在静态方法里访问不了类或则实例中的任何属性
1)我们要写一个只在类中运行而不在实例中运行的方法.
2)经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法.
3)比如更改环境变量或者修改其他类的属性等能用到静态方法.
4)这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难.
3. 调用方式: 既可以被类直接调用,也可以通过实例调用
class B():
def fun():
print('hello,word')
a=B()
a.fun() #实例调用
B.fun() #类调用
***结果*****
hello,word
hello,word
类方法
可以被类调用,也可以被实例对象调用,实例调用可以给类增加属性,类的属性修改需要通过类进行修改,类方法需要使用关键字cls,定义时候需要在函数前加@classmethod
作用:无需实例化直接被类调用 特性: 类方法只能访问类变量,不能访问实例变量 类方法使用场景: 当我们还未创建实例,但是需要调用类中的方法 调用方式: 既可以被类直接调用,也可以通过实例调class Student(object):
school='www'
@classmethod
def printmassage(cls):
print(cls.school)
s1=Student()
Student.printmassage() # 类调用
s1.printmassage() # 实例调用
s1.school='beijingjiyun' #为类的实例增加属性,类的实例school本身不改变
print(Student.school)#www
print(s1.school)#beijingjiyun
Student.school='jiyunstudy'#通过类对类的属性school做修改,类的属性发生改变
s1.printmassage() #jiyunstudy
*****结果*******
www
www
www
beijingjiyun
jiyunstudy
静态属性
静态属性。@property。作用就是把类的函数属性,封装成类似数据属性。再调用函数printmassage 时候,必须不带()执行。
class Student(object):
school='szu'
@property
def printmassage(self):
print('aaaa')
s1=Student()
s1.printmassage #aaaa
魔法方法
type生成类调用顺序class Student(object):
def __new__(cls, *args, **kwargs):
print('__new__')
return object.__new__(cls) # 必须返回父类的__new__方法,否则不不执行__init__方法,无法创建实例
def __init__(self,name):
print('__init__')
self.name = name
def __str__(self): # 作用:打印实例时显示指定字符串,而不是内存地址
print('__str__')
return self.name
def __call__(self, *args, **kwargs): # 当执行C()(*args) 或者 s1(*args) 就会执行__call__
print('__call__',*args)
def __del__(self): # 作用:清除无用的实例对内存的暂用
print('__del__')
#1、实例化时机会执行__new__、__init__
s1 = Student('tom')
#2、执行 实例() 就会执行__call__ 方法,并将参数传递给__call__函数
s1('call01')
#3、当打印实例时就会执行 __str__ 方法下返回的字符串(默认返回的实例地址)
print(s1)
#4、析构方法:当删除实例时就会调用 __del__ 方法
del s1
# 析构方法作用:在程序结束后会自动执行析构方法删除所有实例
# 但是在程序运行时有很多实例是无用的,但是python内存回收机制却不会自动删除他们,这样就浪费内存
# 我们可以执行 del s1 ,那么在程序运行时,python内存回收机制会检测到这些实例时无用的,才会删除
# 其实我们执行del s1,并没有回收内存,只不过是摘除门牌号,python内存回收机制发现没有门牌号后会自动回收内存