面向对象

xiaoxiao2021-02-28  28

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 ④ 实例对象也能访问类方法,不建议,逻辑上说不通
转载请注明原文地址: https://www.6miu.com/read-2619805.html

最新回复(0)