python类属性实例属性.类方法实例方法静态方法的区别(详细全面)tcy

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

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

def 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 15
1.2.a.__class__.g= 10 10
2.1.method= 10 20 30
2.1.method= 40 50 60
2.2.method= 10 20 30
2.2.method= 40 50 60
3.1.A.g= 10
3.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])
"""

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值