类的实例方法、静态方法、类方法,静态属性及魔法方法

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 <module>
    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

  1. 作用:无需实例化直接被类调用
  2. 特性: 类方法只能访问类变量,不能访问实例变量
  3. 类方法使用场景: 当我们还未创建实例,但是需要调用类中的方法
  4. 调用方式: 既可以被类直接调用,也可以通过实例调
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

魔法方法

  1. type生成类调用顺序
    new : 先于__init__方法,每生成一个实例执行一次,new 类方法创建实例对象
    init : __init__方法每生成一个实例就会执行一次,初始化实例对象
    call : 后与__init__方法,C()() 使用类再加一个括号调用, C为类名称
    del : 析构方法,删除无用的内存对象(当程序结束会自动自行析构方法)
  2. 类实例化时魔法方法调用顺序
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内存回收机制发现没有门牌号后会自动回收内存
发布了7 篇原创文章 · 获赞 6 · 访问量 118

猜你喜欢

转载自blog.csdn.net/weixin_46451496/article/details/104629775
今日推荐