本人最近做一个项目,对于类有些迷惑,搜索整理比较全面,推荐大家观看以下视频,你会理解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,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])
"""