今日内容
1.面向对象的成员
2.组合(类似于建立模型->多个类之间的相互嵌套)
成员
成员:类的成员
class Foo: country = 'CN'#为类创建了一个变量又称'静态字段',可以在obj1和obj2里面找到 def __init__(self,name):#对象变量(变量)/实例变量(本质上是个函数) self.name = name def func():#方法(函数) pass obj1 = Foo('negu') obj2 = Foo('negi') ''' obj1和obj2实例化的时候不止创建了name还创建了类对象指针,obj1和obj2都指向Foo,调用方法的时候都去Foo里面寻找. 而实例变量是放在各自的对象里面各自持有这样是为了节省内存. obj->Foo类的对象 obj->Foo类的实例 '''
成员共分为三类:
第一类:
变量:
-实例变量(字段)
-公有实例变量
-私有实例变量
-类变量(静态字段)
-公有类变量
-私有类变量#几乎不用,但要知道.
字段
class Foo: country = 'CN' # 为类创建了一个变量又称'静态字段',可以在obj1和obj2里面找到 def __init__(self, name): # 对象变量(变量)/字段/实例变量(本质上是个函数) self.name = name def func(): # 方法(函数) pass obj1 = Foo('negu') obj2 = Foo('negi') print(obj1.country)#CN obj1.country = 'US'会改自己内部的country,obj2.country还是CN.也可以在外部往类里面创建新变量. print(obj2.country)#CN #通过对象没法改类里面的值. #准则:实例变量(字段),使用对象访问,即obj1.name # 类变量(静态字段)访问时,使用类方法来进行访问,即Foo.country,实在不方便才使用对象. #什么时候用类变量:当不同对象中有相同的值的时候才用类变量(要改都改,要删都删的时候).将实例变量提取到类变量中. #易错点 ''' obj1.name = 'tom' obj1.country = 'US' print(obj1.name)#tom print(obj1.country)#US ''' ############## 私有实例变量(私有字段) ############## class Foo: def __init__(self,name): self.__name = name#加两个下划线变成私有变量,在外部不可获取.在类里面定义的函数可以调用.称为私有的实例变量或者私有字段. self.age = '22'#在内部定义而在外部可以获取的叫公有变量. def print_func(self): print(self.__name) obj = Foo('negu') obj.print_func() print(obj.age) ############## 私有类变量(私有静态字段) ############## class Foc: __country = 'cn' def __init__(self): pass def print_func(self):#内部调用 print(self.__country) print(Foc.__country) objFoc = Foc() objFoc.print_func()#打印cn #print(Foc.__country)#报错 ############## 私有字段在父类和子类之间的调用############ class Base(object):#python里面定义类的时候自动继承object(用于开辟类的内存等等之类的操作) __secret = '受贿' def secret_paper(self): print(self.__secret) class Son(Base): def print_function(self): print(self.__secret)#报错.无法执行 obj = Son() # print(obj.__secret)#报错 # obj.print_function()#报错 obj.secret_paper()#不报错
第二类:
方法:
-方法/实例方法
-静态方法
-类方法
class Foo(object): def func(self): #func下面有波浪线,表示没必要,因为没有用到self print('实例方法') obj = Foo() obj.func()#实例方法 class Foo1: def __init__(self,name): self.name = 'gegege' def func(self):#里面用到self才有必要 print(self.name) obj1 = Foo1('negu') obj1.func()#实例方法 ############ 静态方法 ############ class Static: def __init__(self,name): self.name = name #实例方法 def func(self): print(self.name) @staticmethod#固定搭配 #静态方法,可以直接通过类调用,如果方法中无需使用对象中封装的值,就用静态方法.相当于在类中写函数 def display():#可以传参也可以不传,和函数一样 print('666') objStatic = Static('negu') Static.display()#通过类调用 objStatic.display()#通过对象调用 ''' 总结: 1.编写时:方法上方有个@staticmethod 方法参数可有可无 2.调用时: -类.方法名() -对象.方法名() 3.什么时候写静态方法? -无需调用对象中封装的值 ''' #类方法,相当于静态方法的补充 class ClassMethod: @classmethod def show(cls,x1,x2):#cls这个参数在python的内部会帮你自动传递 print(cls,x1,x2) #获取当前类的时候才用类方法.获取当前对象则用实例方法,什么都不用用静态方法. ClassMethod.show(1,8) ''' 总结: 1.定义时 -方法上写@classmethod -()至少有一个cls参数 2.执行时: -类名.方法() 默认会将当前类传到参数中 3.什么时候使用 -如果在函数中使用当前类就使用类方法. ''' ''' 面试题:静态方法和实例方法的区别和作用? 1.定义的时候:@@ 2.执行的时候:实例方法要先实例化,静态和类可以直接类名.方法调用 3.应用场景:不会用到对象相关数据时用静态方法和类方法,如果代码用到当前类则用类方法,其它情况用静态方法. ''' ################ 私有的实例方法 ############### class Foo: def __init__(self): pass def __display(self,arg): print('私有方法',arg) def real_display(self): self.__display('fuck') obj = Foo() # obj.__display()#报错 obj.real_display()#成功调用 ############### 私有的静态方法 ############ class Foo1: def __init__(self): pass @staticmethod def __display(): print('私有方法') def real_display(self): self.__display() # Foo1.display #访问不到,通过实例方法或再写一个正常静态方法调用.
嵌套
''' 创建三个学校,学校的大部分内容和设施都是一致. ''' class Company: def __init__(self,name,address): self.name = name self.address =address def speech(self): pass Company1 = Company('滴滴公司','北京') Company2 = Company('腾讯公司','深圳') Company3 = Company('华为公司','深圳') class Teacher: def __init__(self,name,gender,address,salary): self.name = name self.gender = gender self.__salary = salary self.address =address self.company = None t1 = Teacher('negu','male','Fuzhou','188888') t2 = Teacher('negu older 10 years','male','ShenZheng','500000') t3 = Teacher('negu older 20 years','male','ShenZheng','750000') t1.company = Company1#在t1对象里面做了一个嵌套 print(t1.company.address)#北京,对象和对象之间的嵌套关系 准则:不仅字段,方法也要归类,为嵌套做准备.
练习题
要求:
data_list = [] #数据太多,进行分页展示 for i in range(1,901) data_list.append('negu-%s'%i) page = int(input('请输入要查看的页码:')) #900条数据进行分页展示,默认每页十条,且用面向对象的方法编写。
————
class PageDivision: def __init__(self,page,num_per_page=10): ''' 初始化一些参数 :param page:当前页码 :param num_per_page:每页显示的数据数 ''' self.page = int(page) self.num_per_page = int(num_per_page) @property#Python内置的@property装饰器就是负责把一个方法变成属性调用的 def start_score(self): return (self.page-1)*self.num_per_page @property def end_score(self): return self.page * self.num_per_page data_list = [] for i in range(1,301): data_list.append('negu-%s'%i) page = input('请输入要查看的页码') obj = PageDivision(page) page_data = data_list[obj.start_score:obj.end_score] for item in page_data: print(item)