python类属性实例属性.类方法实例方法静态方法的区别(详细全面)tcy
发布日期:2021-06-29 14:44:08 浏览次数:3 分类:技术文章

本文共 3908 字,大约阅读时间需要 13 分钟。

本人最近做一个项目,对于类有些迷惑,搜索整理比较全面,推荐大家观看以下视频,你会理解python类的真髓。

项目 类属性 实例属性 实例方法 类方法 静态方法
用途: 1.类似全局变量 1.类实例的变量 1.访问类实例属性 1.访问类属性 1.类似一个独立函数;专属于类
2.所有方法都可以读写 2.仅仅实例方法可读写 2.方法内需要使用实例属性 2.方法内需要使用类属性/类方法 2.方法内无实例属性/类属性/类方法的操作
3.可以访问所有方法 3.可以访问类方法静态方法 3.可以访问类方法静态方法
创建时间: 类创建时已分配 类实例化时创建 已创建,没分配内存,使用时在分配内存
公共: 类似public 类似private 类似public
函数参数1:    -    - self cls 于类无关,正常函数的参数
创建: 初始化函数上类似g=0 初始化函数内部 类似 @classmethod @staticmethod
  g=0 self.x=0 def func(self,...) def func(cls,...) def func(...)
使用: class A;a=A()         
无类实例化: A.g 不能使用 不能使用 A.func() A.func()
类实例化: A.g(a.g和A.g不同) a.x; a.func()==A.func(a,...) a.func() a.func()
a.__class__.g==A.g

 

python类属性实例属性.类方法实例方法静态方法的区别:1.实例方法,类方法,静态方法都属于类,区别在于调用方式不同;1.1.实例方法:  实例对象调用,至少有一个参数self(表示实例对象),执行实例方法时,  自动将该调用方法的对象赋值给self(self其实是引用调用的实例对象)1.2.类方法(@classmethod装饰):  类和实例对象都可以调用;至少有一个参数cls(表示类);  自动将调用该方法的对象赋值给cls(cls其实是引用当前类)1.3.静态方法(@staticmethod装饰)  类和实例对象都可以调用,没有默认参数;其实它存在和外部定义函数没有区别;2.属性类属性是共有的,而实例属性是实例独有的,如果想要修改属性就会有对应的方法(类方法和实例方法),而静态方法的定义上面说过,作用和平常函数没有区别,但是,假设在外部定义对应的静态方法,如果存在多个类都想引用此方法,哪定义这个方法就会有歧义(函数是为了哪个类定义的),而定义静态方法的出发点是:不需要传入特定的参数,功能简单,和类方法和实例方法归为一类;推荐观看:https://www.bilibili.com/video/av50979957?from=search&seid=3682306859886449416
#!/usr/bin/env python3# -*- coding: utf-8-*-class A(object):    g=10       def __init__(self,x):        self.x=x    #方法定义    def add(self,y):return self.x+y+A.g-20    @classmethod    def add_cls(cls,x,y):return x+y+cls.g+A.g-20    @staticmethod    def add_static(x,y):return x+y+A.g    def add1(self,x,y):return self.add(y)+A.add_cls(x,y)+A.add_static(x,y)-20    @classmethod    def add_cls1(cls,x,y):return A.add_cls(x,y)+A.add_static(x,y)    @staticmethod    def add_static1(x,y):return A.add_cls(x,y)+A.add_static(x,y)+10    #类变量修改    def set_g(self,g):A.g=g    def get_g(self):return A.g    @classmethod    def set_g_cls(cls,g):A.g=g    @classmethod    def get_g_cls(self):return A.g    @staticmethod    def set_g_static(g):A.g=g    @staticmethod    def get_g_static():return A.g#测试程序#方法测试def test_method():    print('1.1.method=',A.g,A.add_cls(2,3),A.add_static(2,3))    a=A(2)    print('1.2.a.__class__.g=',A.g,a.__class__.g)def test():    a1=A(10)    a2=A(20)    x=10;y=10;    print('2.1.method=',a1.add(y),a1.add_cls(x,y),a1.add_static(x,y))    print('2.1.method=',a1.add1(x,y),a1.add_cls1(x,y),a1.add_static1(x,y))    print('2.2.method=',A.add(a1,y),A.add_cls(x,y),A.add_static(x,y))    print('2.2.method=',A.add1(a1,x,y),A.add_cls1(x,y),A.add_static1(x,y))#类属性测试def view(a1,A):    lst1=[A.g,a1.get_g(),a1.get_g_cls(),a1.get_g_static()]    lst2=[A.g,A.get_g(a1),A.get_g_cls(),A.get_g_static()]    return lst1,lst2def test_g():    print('3.1.A.g=',A.g)    a1=A(10)    a2=A(20)    a1.set_g(20)    print('3.2.A.g=',view(a1,A))    print('3.2.A.g=',view(a2,A))    A.set_g(a1,30)    print('3.2.A.g=',view(a1,A))    print('3.2.A.g=',view(a2,A))    a1.set_g_cls(40)    print('3.2.A.g=',view(a1,A))    print('3.2.A.g=',view(a2,A))    A.set_g_cls(50)    print('3.2.A.g=',view(a1,A))    print('3.2.A.g=',view(a2,A))    a1.set_g_static(60)    print('3.2.A.g=',view(a1,A))    print('3.2.A.g=',view(a2,A))    A.set_g_static(70)    print('3.2.A.g=',view(a1,A))    print('3.2.A.g=',view(a2,A))    if __name__=="__main__":    test_method()    test()    test_g()"""1.1.method= 10 5 151.2.a.__class__.g= 10 102.1.method= 10 20 302.1.method= 40 50 602.2.method= 10 20 302.2.method= 40 50 603.1.A.g= 103.2.A.g= ([20, 20, 20, 20], [20, 20, 20, 20])3.2.A.g= ([20, 20, 20, 20], [20, 20, 20, 20])3.2.A.g= ([30, 30, 30, 30], [30, 30, 30, 30])3.2.A.g= ([30, 30, 30, 30], [30, 30, 30, 30])3.2.A.g= ([40, 40, 40, 40], [40, 40, 40, 40])3.2.A.g= ([40, 40, 40, 40], [40, 40, 40, 40])3.2.A.g= ([50, 50, 50, 50], [50, 50, 50, 50])3.2.A.g= ([50, 50, 50, 50], [50, 50, 50, 50])3.2.A.g= ([60, 60, 60, 60], [60, 60, 60, 60])3.2.A.g= ([60, 60, 60, 60], [60, 60, 60, 60])3.2.A.g= ([70, 70, 70, 70], [70, 70, 70, 70])3.2.A.g= ([70, 70, 70, 70], [70, 70, 70, 70])"""

 

转载地址:https://chunyou.blog.csdn.net/article/details/104483616 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:python实现Pyqt5信号槽在多线程中的应用(类相互调用) tcy
下一篇:python删除指定文件夹下指定扩展名的文件(按日期排序,保留不删除的文件数量)(tcy)

发表评论

最新留言

很好
[***.229.124.182]2024年04月12日 12时47分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章