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