Python的类的组合
python中,类的加载顺序
类是在文件加载时,会跟着加载
1 类名
2 类中的变量,从上到下,依次进行
3 加载到方法时,方法内的内容不执行,但是会开辟一个空间用来存储方法内的数据
4 当类内的方法和变量都加载完成时,会将类名指向self参数。
class Student: # 第一步 def __init__(self,name,age,sex): # 第二步 self.name = name self.age = age self.sex = sex a = 1 # 第三步 b = 2 # 第四步 def fun(): # 第五步 pass # 第六步,类名指向self yang = Student('小明',20,'男')
5 如果类中存在两个名称相同的变量或者方法,那么输出后的内容是后加载的变量或者方法的内容
class Student: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex a = 1 b = 2 a = 4 # 变量的输出结果是这个 print(a) def fun(): pass def fun(): print("in the func") # 函数的输出结果是这个 yang = Student('小明',20,'男')
类外创建对象时,每个self参数对应各自一个内存空间,并将信息增加到这个内存空间
每个对象的内存空间中有个类指针,相当于一个变量,里面存在着一个类的地址
如果自己的空间中有这个名字,那么他就直接在自己的空间中调用
class Student: country = 'China' def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex zhang = Student('小明',23,'男’) li= Student('小花',21,'女’) li.country = 'us' print(zhang.country) # 输出结果为China print(li.country) # 输出结果为us
当自己内存中不存在这个数据的情况下,它会根据指针到类中去查找,如果有就返回,如果没有就报错
如果每个对象都需要调用同一个变量,那么他们需要的变量必须调用的是类中的变量,而不是自己内存中存在的变量。
主要是对一个对象.名字直接赋值,那么就是在这个对象的空间内创建了新的属性
对一个可变的数据类型内部的变化,那么仍然是所有的对象的类共享改变的成果
class B: l = [0] def __int__(self): self.name= name b1 = B('小明') b2 = B('小黑') b1.l[0]+=1 # 因为l是可变类型,所以这类也改变了,类中的变量 print(b2.l[0]) # 结果为1 b1.l = [123] # 这个值就是在b1中的变量,对类中的变量没影响 print(b2.l) # 结果是0
耦合(相互纠缠)
组合: 一个类的对象是另一个类的对象的属性
类,就可以调用上面的类中的数据和方法
class Student: def __init__(self,name,num,course): self.name = name # 这里就是调用了下面那个类的属性,course的对象成了另一个类的对象的属性 self.num = num self.course = course class Course: def __init__(self,name,price,period): self.name = name self.price = price self.period = period python = Course('python',25000,'6 months') s1 = Student('小黑',10085,python) s2 = Student('小洪',10084,python) s3 = Student('小李',10083,python) # print(s1.__dict__) python.price = 30000 python.period = '7 months'