1.类的定义
定义变量、方法
方法必须传入self
方法内部,如果要用类的变量,需要self.
作用:封装代码,他将数据已经这些数据上的操作封装在一起
class Student():
name = ""
age = 0
def print_file(self):
print("name:"+str(self.name))
print("age:"+str(self.age))
st = Student()
st.print_file()
区分模块下的变量、函数,跟类下的成员、方法
类只负责定义一个行为,不负责执行
2.构造函数
默认renturn None,不能返回其他类型,这个是区别于类的普通方法的。
3.区别模块变量和类的变量
模块下变量,是不能跟类下的变量等同的。
4.类变量与实例变量
类变量:和类关联一起
实例变量:和实例关联一起,通过在__init__方法中self.定义
场景一:定义类变量和实例变量name
class Student3():
name = "" #类变量
age = 0
def __init__(self,name,age):
self.name = name #实例变量
self.age = age
st3 = Student3("zzq",19)
print("name:",st3.name)
print("name:",Student3.name)
场景二:定义类变量name,实例是可以访问类变量的
class Student4():
name = "类变量name"
age = 0
def __init__(self,age):
self.age = age
st4 = Student4(19)
print("name:",st4.name)
print("name:",Student4.name)
从现实世界来看,类变量定义名称和年龄是不合理的
场景三:定义有意义的类变量
class Student5():
sum = 0
def __init__(self,name,age):
self.name = name
self.age = age
print(Student5.sum)
5.类和对象的变量查找顺序
__dict__内置变量可以查找对象下所有变量
场景一:如下name打印出来的竟然是类变量名称,而非实例变量名称
class Student6():
name = "类变量名称"
age = 0
def __init__(self,name,age):
name = name
age = age
st6 = Student6("zzq",19)
print("name:",st6.name) #打印“"类变量名称"”
print(st6.__dict__) #打印{},说明实例中还没有变量,上面打印类变量是因为变量查找顺序
场景二:如下name打印出来的竟然是类变量名称,而非实例变量名称
class Student7():
name = "类变量名称"
age = 0
def __init__(self,name,age):
self.name = name
self.age = age
st7 = Student7("zzq",19)
print("name:",st6.name) #打印“"类变量名称"”
print(st7.__dict__)# #打印{'name': 'zzq', 'age': 19},说明实例中有变量name=‘zzq’
总结变量查找顺序:如果尝试访问一个实例变量,那么python首先在对象的实例变量列表__dict__中查找,是否存在name这样的变量,如果没有,python不会返回None,它会继续在类变量列表中寻找
如果类变量列表中也没有,会去父类变量列表中去找。
6.self与实例方法
python建议使用self,显胜于隐,self代表调用当前方法的某个对象。只跟对象实例有关,跟类没有关系,self只是代表实例,而不是类
实例方法:特征,第一个参数必须是self。
7.在实例方法中访问实例变量和类变量
①python思维导图
变量:类变量、实例变量
方法:实例方法
构造函数
②实例变量和类变量
class Student8():
sum1 = 0
name = "类变量名称"
age = 0
def __init__(self,name,age):
self.name = name
self.age = age
print(self.name) #zzq 读取的是实例变量name
print(self.age) #19 读取的是实例变量age
print(name) #zzq,读取的是形参中的name
print(age) #19 读取的是形参中的age
print(Student8.name) #类变量名称
print(Student8.sum1)
st8 = Student8("zzq",19)
print(st8.__dict__) #{'name': 'zzq', 'age': 19}
print(Student8.__dict__) #'sum': 0, 'name': '类变量名称', 'age': 0
print("name:",st8.name) #zzq
print("name:",Student8.name) #类变量名称
③实例方法中访问类变量场景一:通过self.__class__.访问类变量
class Student10():
sum1 = 0
def __init__(self,name,age):
self.name = name
self.age = age
print(self.__class__.sum1) # 0
st10 = Student10("zzq",19)
print(Student10.sum1) # 0
④实例方法中访问类变量场景一:通过类.类变量
8.类方法
①python思维导图
变量:类变量、实例变量
方法:实例方法、类方法
构造函数
②实例方法中操作类变量
class Student11():
sum1 = 0
def __init__(self,name,age):
self.name = name
self.age = age
# Student11.sum1 +=1
self.__class__.sum1 +=1
print("当前学生数量",str(self.__class__.sum1))
st11_1 = Student11("zzq",19)
st11_2 = Student11("zzq2",19)
③类方法中操作类变量,需要用到classmethod装饰器
作业:如果操作一个跟对象无关的变量,建议还是用类方法
class Student12():
sum1 = 0
def __init__(self,name,age):
self.name = name
self.age = age
@classmethod
def plus_sum(cls):
cls.sum1 +=1
print(cls.sum1)
Student12.plus_sum() #1
Student12.plus_sum() #2
④ 实例对象也能访问类方法,不建议,逻辑上说不通
定义变量、方法
方法必须传入self
方法内部,如果要用类的变量,需要self.
作用:封装代码,他将数据已经这些数据上的操作封装在一起
class Student():
name = ""
age = 0
def print_file(self):
print("name:"+str(self.name))
print("age:"+str(self.age))
st = Student()
st.print_file()
区分模块下的变量、函数,跟类下的成员、方法
类只负责定义一个行为,不负责执行
2.构造函数
默认renturn None,不能返回其他类型,这个是区别于类的普通方法的。
3.区别模块变量和类的变量
模块下变量,是不能跟类下的变量等同的。
4.类变量与实例变量
类变量:和类关联一起
实例变量:和实例关联一起,通过在__init__方法中self.定义
场景一:定义类变量和实例变量name
class Student3():
name = "" #类变量
age = 0
def __init__(self,name,age):
self.name = name #实例变量
self.age = age
st3 = Student3("zzq",19)
print("name:",st3.name)
print("name:",Student3.name)
场景二:定义类变量name,实例是可以访问类变量的
class Student4():
name = "类变量name"
age = 0
def __init__(self,age):
self.age = age
st4 = Student4(19)
print("name:",st4.name)
print("name:",Student4.name)
从现实世界来看,类变量定义名称和年龄是不合理的
场景三:定义有意义的类变量
class Student5():
sum = 0
def __init__(self,name,age):
self.name = name
self.age = age
print(Student5.sum)
5.类和对象的变量查找顺序
__dict__内置变量可以查找对象下所有变量
场景一:如下name打印出来的竟然是类变量名称,而非实例变量名称
class Student6():
name = "类变量名称"
age = 0
def __init__(self,name,age):
name = name
age = age
st6 = Student6("zzq",19)
print("name:",st6.name) #打印“"类变量名称"”
print(st6.__dict__) #打印{},说明实例中还没有变量,上面打印类变量是因为变量查找顺序
场景二:如下name打印出来的竟然是类变量名称,而非实例变量名称
class Student7():
name = "类变量名称"
age = 0
def __init__(self,name,age):
self.name = name
self.age = age
st7 = Student7("zzq",19)
print("name:",st6.name) #打印“"类变量名称"”
print(st7.__dict__)# #打印{'name': 'zzq', 'age': 19},说明实例中有变量name=‘zzq’
总结变量查找顺序:如果尝试访问一个实例变量,那么python首先在对象的实例变量列表__dict__中查找,是否存在name这样的变量,如果没有,python不会返回None,它会继续在类变量列表中寻找
如果类变量列表中也没有,会去父类变量列表中去找。
6.self与实例方法
python建议使用self,显胜于隐,self代表调用当前方法的某个对象。只跟对象实例有关,跟类没有关系,self只是代表实例,而不是类
实例方法:特征,第一个参数必须是self。
7.在实例方法中访问实例变量和类变量
①python思维导图
变量:类变量、实例变量
方法:实例方法
构造函数
②实例变量和类变量
class Student8():
sum1 = 0
name = "类变量名称"
age = 0
def __init__(self,name,age):
self.name = name
self.age = age
print(self.name) #zzq 读取的是实例变量name
print(self.age) #19 读取的是实例变量age
print(name) #zzq,读取的是形参中的name
print(age) #19 读取的是形参中的age
print(Student8.name) #类变量名称
print(Student8.sum1)
st8 = Student8("zzq",19)
print(st8.__dict__) #{'name': 'zzq', 'age': 19}
print(Student8.__dict__) #'sum': 0, 'name': '类变量名称', 'age': 0
print("name:",st8.name) #zzq
print("name:",Student8.name) #类变量名称
③实例方法中访问类变量场景一:通过self.__class__.访问类变量
class Student10():
sum1 = 0
def __init__(self,name,age):
self.name = name
self.age = age
print(self.__class__.sum1) # 0
st10 = Student10("zzq",19)
print(Student10.sum1) # 0
④实例方法中访问类变量场景一:通过类.类变量
8.类方法
①python思维导图
变量:类变量、实例变量
方法:实例方法、类方法
构造函数
②实例方法中操作类变量
class Student11():
sum1 = 0
def __init__(self,name,age):
self.name = name
self.age = age
# Student11.sum1 +=1
self.__class__.sum1 +=1
print("当前学生数量",str(self.__class__.sum1))
st11_1 = Student11("zzq",19)
st11_2 = Student11("zzq2",19)
③类方法中操作类变量,需要用到classmethod装饰器
作业:如果操作一个跟对象无关的变量,建议还是用类方法
class Student12():
sum1 = 0
def __init__(self,name,age):
self.name = name
self.age = age
@classmethod
def plus_sum(cls):
cls.sum1 +=1
print(cls.sum1)
Student12.plus_sum() #1
Student12.plus_sum() #2
④ 实例对象也能访问类方法,不建议,逻辑上说不通