特殊方法,类之间的关系,分页

 

#特殊方法
class Foo(object):

    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
    
    def __call__(self, *args, **kwargs):
        print(11111,args,kwargs)
        return 123

    def __getitem__(self, item):
        print(item)
        return 8

    def __setitem__(self, key, value):
        print(key,value,111111111)

    def __delitem__(self, key):
        print(key)

    def __add__(self, other):
        return self.a1 + other.a2

    def __enter__(self):
        print('1111')
        return 999  #返回值给 f
  def __exit__(self, exc_type, exc_val, exc_tb): 
    print('22222') 
# 1. 类名() 自动执行 __init__ 
  obj = Foo(1,2) 
# 2. 对象() 自动执行 __call__ 
  ret = obj(6,4,2,k1=456) 
# 3. 对象['xx'] 自动执行 __getitem__ 
  ret = obj['yu'] print(ret) 
# 4. 对象['xx'] = 11 自动执行 __setitem__ 
  obj['k1'] = 123 
# 5. del 对象[xx] 自动执行 __delitem__ 
  del obj['uuu'] 
# 6. 对象+对象 自动执行 __add__ 
  obj1 = Foo(1,2) 
  obj2 = Foo(88,99) 
  ret = obj2 + obj1 print(ret) 
# 7. with 对象 自动执行 __enter__ / __exit__ 
  obj = Foo(1,2) 
  with obj as f: #__enter__的返回值给f
    print(f) print('内部代码')
# 8. 真正的构造方法
 class Foo(object):
     def __init__(self, a1, a2):     # 初始化方法
         self.a1 = a1
         self.a2 = a2

     def __new__(cls, *args, **kwargs): # 构造方法
         """
         开辟一个内存空间,空对象
       
         """
         return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.).

 obj1 = Foo(1,2)
 print(obj1)

 obj2 = Foo(11,12)
 print(obj2)
class ff:
    def __new__(cls, *args, **kwargs):
        print('new')
        return object.__new__(cls)
    def __init__(self,name):
        self.name=name
        print('init')
    def __iter__(self):
        return [9,8,7,6]
  def __str__(self):
         return 'ff的对象'

  

#9.对象.__dict__ 获取对象所有的属性 
print(obj3.__dict__) 
#10.对象.__iter__() #获取迭代器,在类中写此方法可以使对象变为可迭代对象 
for el in obj3.__iter__(): 
  print(el)
#11.改写__str__()方法
print(obj3)

  

#分页 方法1
class Pager:

    def __init__(self, lst, pageSize):
        self.lst = lst
        self.pageSize = pageSize

    def start(self): # 1
        return self.__zhiding(1)

    def end(self): # 最后一页
        return self.__zhiding(self.totle)

    def index(self): # 指定某一页
        page = int(input("请输入你要显示的页码:"))
        return self.__zhiding(page)

    def __zhiding(self, page):
        return self.lst[self.pageSize * (page - 1): self.pageSize * page]

    @property
    def totle(self):
        totle = 0
        if len(self.lst)%self.pageSize == 0:
            totle = len(self.lst)//self.pageSize
        else:
            totle = len(self.lst) // self.pageSize + 1
        return totle


p = Pager([i for i in range(20000)], 100)
print(p.end())
print(p.index())

#分页 方法2
#pagesize是每页的数据个数
#lst是总数据的列表
class Page:
    @property
    def start(self): #开始的索引
        return (self.index-1)*self.pagesize
    @property
    def end(self):#结束的索引
        return self.index*self.pagesize
    @property
    def total(self):#总页数
        if len(self.lst)%self.pagesize==0:
            return len(self.lst)//self.pagesize
        else:
            return len(self.lst)//self.pagesize +1
    def __init__(self,pagesize=10):
        self.lst=[]             #总数据
        self.pagesize=pagesize  #每页的数据
        self.index=None        #要展示的页码
    def page(self):  #选择展示页码的方法
        p=input('请输入你要查询的数据的页码,按Q退出:')
        if p.upper() == 'Q':
            return 0
        if int(p)<=self.total:
            self.index=int(p)
            return 1
        else:
            return 2

    def show(self):#展示的方法
        for i in range(self.start,self.end):
            print(self.lst[i])
    def makeData(self):#产生数据的方法
        for i in range(20000):
            self.lst.append('测试数据第%s条'%i)
    def run(self):#主程序
        self.makeData()
        while 1:
            fanhuizhi=self.page()
            if fanhuizhi==0:
                break
            elif fanhuizhi==1:
                self.show()
            elif fanhuizhi==2:
                print('输入页码超范围,请重新输入')

 if __name__=='__main__':     
  objt=Page()

  objt.run()
原文地址:https://www.cnblogs.com/PythonMrChu/p/9720471.html