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'