class
参考
https://www.cnblogs.com/geogre123/p/10142510.html
python的类中将在其中定义的变量叫做属性,将函数叫做方法
其中属性分为类属性和实例属性,方法分为静态方法,类方法,实例方法
其中类属性是class中固有属性,而实例属性根据不同的实例对象可以创建不同的实例属性,也即在不同实例中类属性是共享的而实例属性是不共享的
实例方法
定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);只能由实例对象调用
类方法
定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
调用:实例对象和类对象都可以调用
类方法是将类本身作为对象进行操作的方法。
静态方法
定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
静态方法是类中的函数,不需要实例。静态方法是独立的、单纯的函数,它仅仅托管于,某个类的名称空间中,便于使用和维护。
import time
class ClassStu(object):
__num = 0
def __new__(cls, *args, **kwargs):
ClassStu.addNum()
return super(ClassStu, cls).__new__(cls)
@classmethod
def addNum(cls):
cls.__num += 1
@classmethod
def getNum(cls):
return cls.__num
@staticmethod
def getCurTime():
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
class Student(ClassStu):
def __init__(self, name):
self.name = name
stu1 = Student('张三')
stu2 = Student('李四')
print(ClassStu.getCurTime())
print(ClassStu.getNum())
类种相关函数使用方法
print(dir(object)) # 查看类中所有的方法
class A(object):
pass
class B(object):
pass
class C(A, B):
def __init__(self, name, age):
self.name = name
self.age = age
pass
pass
x = C('Jack', 20)
print(x.__dict__) # x是C类型的一个实例对象
print(C.__dict__) # 实例对象的属性字典
print('--------------')
print(x.__class__) # 输出了对象所属的类
print(C.__bases__)#C类的父类类型的元素
print(C.__base__)#最近的一个继承类
print(C.__mro__)#类的层次结构
print(A.__subclasses__())#子类列表
类中相关的魔法函数
a = 20
b = 100
c = a + b
d = a.__add__(b)
print(c)
print(d)
class Student():
def __init__(self, name,age):
self.name=name
self.age=age
pass
def __add__(self, other):
return self.name + other.name
def __len__(self):
return len(self.name)
def __str__(self):
#print('我叫{},我今年{}岁了。'.format(self.name,self.age))
print(f'我叫{self.name},我今年{self.age}岁了')
pass
stu1 = Student('张三',16)
stu2 = Student('李四',17)
print(stu1+stu2)
print(stu1.__len__())
stu1.__str__()
stu2.__str__()
类中的深拷贝和浅拷贝
浅拷贝:python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象
深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
#变量的赋值
import copy
class Cpu:
pass
class Disk:
pass
class Computer:
def __init__(self,cpu,disk):
self.cpu=cpu
self.disk=disk
pass
pass
cpu=Cpu()
disk=Disk()
comp1=Computer(cpu,disk)
#变量的直接赋值
comp2=comp1
print(comp2,comp2.cpu,comp2.disk)
print(comp1,comp1.cpu,comp1.disk)
#浅拷贝(通过结果分析可得这里comp3和comp1两者之间的id不同,不同于直接赋值结果全部相同)
comp3=copy.copy(comp1)
print(comp1,comp1.cpu,comp1.disk)
print(comp3,comp3.cpu,comp3.disk)
#深拷贝(不同于浅拷贝,将其中所有的信息进行递归方式的创建)
comp4=copy.deepcopy(comp1)
print(comp1,comp1.cpu,comp1.disk)
print(comp4,comp4.cpu,comp4.disk)