成员:(3类)
1.变量: 实例变量与类变量
实例变量:包含公有实例变量(字段)和私有实例变量(字段) 区别在于"__"
类变量:也包含公有类变量和私有类变量(静态字段) 区别也在于__
总结: A准则:实例变量(字段)访问时,直接使用对象访问,即:obj.name
类变量(静态字段)访问时,使用类方法,即:Foo.country(实在不方便时,才使用对象方法 (ob j.country))
B易错点:a 创建对象时,传入的参数和原对象中的参数不在同一空间
class Foo: country='china' def __init__(self,name): self.name=name def func(self): ... obj=Foo('america') obj1=Foo('美国') print(obj.name) #结果为america print(obj1.name)# 结果为 美国
B易错点:b 在外部更改(obj.country='中华人民共和国')相当于给局部空间中添加了一个obj.country='中华人民共和国'变量 对类变量没有影响
class Foo: country='china' def __init__(self,name): self.name=name def func(self): ... obj=Foo('america') obj1=Foo('美国') print(Foo.country) #结果为 china print(obj.country) #结果为 china print(obj1.country)# 结果为 china obj.country='中华人民共和国' print(obj.country) #结果为 中华人民共和国 print(obj1.country) # 结果为 china
总结 :1外部无法调用私有类变量,如果想在外部调用显示内部私有变量,可通过熟人(即内部方法)得到(不推荐)2 儿子都不知道的事:即私有变量可在内部被函数类方法调用,但是如果存在父子类对象 在派生类中是无法调用基类中的私有变量的.
2方法 : 实例方法 静态方法 类方法
实例方法: 私有实例方法:在外部无法访问
class Foo: def __init__(self,name): self.name=name #实例方法(存在的必要性调用self中内容) def func(self): print(self.name) #静态方法,如果方法无法使用对象中封装的值,就可使用静态方法 @staticmethod def display(a1,a2): return a1+a2 obj=Foo('金角大王') obj.func() #结果为金角大王 obj1 = Foo.display(3,1) print(obj1) #结果为4
静态方法: 私有静态方法:在外部调用时会报错
1编写时,上方写@staticmethod 参数可有可无
2 调用时, **推荐使用 类.方法名(参数(可有可无)) *不推荐 对象.方法名()
3静态方法存在必要:无需调用对象中封装的值.
类方法: 1 定义时, 上方写@classmethod,至少有一个cls参数
2执行时, 类名.方法名() 默认会将当前类传到参数中
3何时使用?如果方法中或使用到当前类,就可以使用类方法
class Foo(object): def __init__(self, name): self.name = name # 实例方法,self是对象 def func(self): print(self.name) # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法 @staticmethod def display(a1,a2): return a1 + a2 # 类方法,cls是类 @classmethod def show(cls,x1,x2): print(cls,x1,x2) # 执行类方法 Foo.show(1,8)
3属性:通过方法改造出来
1编写时 上方写@property 只有一个self参数
2调用时:无需加括号 直接 对象.方法 调用
3应用场景:对于简单的方法,当无需传值且有返回值时
示例:
class Foo(object): class Foo(object): def __init__(self): pass @property def start(self): return 1 @property def end(self): return 10 obj = Foo() print(obj.start) print(obj.end)
练习题:
翻页问题
# 以前写法 # data_list = [] # # for i in range(1, 901): # data_list.append('alex-%s' % i) # # while True: # # 1. 要查看的页面 # page = int(input('请输入要查看的页码:')) # # # 2. 每页显示 10 条 # per_page_num = 10 # # start = (page-1) * per_page_num # end = page * per_page_num # # page_data_list = data_list[start:end] # for item in page_data_list: # print(item) class Pagenation(object): """ 处理分页相关的代码 """ def __init__(self,page,per_page_num=10): """ 初始化 :param page: 当前要查看的页面 :param per_page_num: 每页默认要显示的数据行数 """ self.page = page self.per_page_num = per_page_num @property def start(self): """ 计算索引的起始位置 :return: """ return (self.page-1) * self.per_page_num @property def end(self): """ 计算索引的结束位置 :return: """ return self.page * self.per_page_num data_list = [] for i in range(1, 901): data_list.append('alex-%s' % i) while True: # 1. 要查看的页面 page = int(input('请输入要查看的页码:')) obj = Pagenation(page) page_data_list = data_list[obj.start:obj.end] for item in page_data_list: print(item)
class Pagenation(object): """ 处理分页相关的代码 """ def __init__(self,data_list,page,per_page_num=10): """ 初始化 :param data_list: 所有的数据 :param page: 当前要查看的页面 :param per_page_num: 每页默认要显示的数据行数 """ self.data_list = data_list self.page = page self.per_page_num = per_page_num @property def start(self): """ 计算索引的起始位置 :return: """ return (self.page-1) * self.per_page_num @property def end(self): """
附送:嵌套了解
"" 创建三个学校且三个学校的设施内容等都是一致. """ class School(object): def __init__(self, name, address): self.name = name self.address = address def speech(self): print('讲课') obj1 = School('老男孩北京校区', '美丽富饶的沙河') obj2 = School('老男孩上海校区', '浦东新区') obj3 = School('老男孩深圳校区', '南山区') class Teacher(object): def __init__(self, name, age, salary): self.name = name self.age = age self.__salary = salary self.school = None t1 = Teacher('李杰', 19, 188888) t2 = Teacher('艳涛', 18, 60) t3 = Teacher('女神',16, 900000) # ############## 老师分配校区 t1.school = obj1 t2.school = obj1 t3.school = obj2 # #################################### # 查看t1老师,所在的校区名称/地址 print(t1.school.name) print(t1.school.address) print(t1.name) print(t1.age) t1.school.speech()