P27026字典:当索引不好用时1----20201005

    科技2022-08-14  102

    这里写目录标题

    P27 026字典:当索引不好用时1----20201005P31 030文件系统:介绍一个高大上的东西1006P32 031永久存储:研制一缸美味的泡菜1006P33 032异常处理:你不可能总是对的1--1006P34 033异常处理:你不可能总是对的2--1006P35 034丰富的else语句及简洁的with语句1006P36 035图形用户界面入门:easygui1007安装easygui P37 036类和对象:给大家介绍对象1007P38 037类和对象:面向对象编程1008P39 038类和对象:继承1008P40 039类和对象:拾遗1008P41 040类和对象:一些相关的BIF1008P42 041魔法方法:构造和析构1009P43 042魔法方法:算术运算1--1009P44 043魔法方法:算数运算2--1010P45 044魔法方法:简单定制1010P46 045魔法方法:属性访问1011P47 046魔法方法:描述符1024P42# P42

    P27 026字典:当索引不好用时1----20201005

    >>> brand = ['李宁','耐克','阿迪达斯','鱼'] >>> slogan = ['一切皆有可能','just do it','impossible is nothing ','让编程改变世界'] >>> print ('鱼的口号是',slogan[brand.index('鱼')]) 鱼的口号是 让编程改变世界 >>> dict1={'李宁':'一切皆有可能','耐克':'just do it','阿迪达斯':'impossible is nothing ','鱼':'让编程改变世界'} >>> print('鱼的口号是',dict1['鱼']) 鱼的口号是 让编程改变世界 >>> dict2 = {1:'one',2,'two',3,'three'} SyntaxError: invalid syntax >>> dict2 = {1:'one',2:'two',3:'three'} >>> dict2[2] 'two' >>> dict3 = {} >>> dict3 {} >>> help(dict) Help on class dict in module builtins: class dict(object) | dict() -> new empty dictionary | dict(mapping) -> new dictionary initialized from a mapping object's | (key, value) pairs | dict(iterable) -> new dictionary initialized as if via: | d = {} | for k, v in iterable: | d[k] = v | dict(**kwargs) -> new dictionary initialized with the name=value pairs | in the keyword argument list. For example: dict(one=1, two=2) | | Methods defined here: | | __contains__(self, key, /) | True if D has a key k, else False. | | __delitem__(self, key, /) | Delete self[key]. | | __eq__(self, value, /) | Return self==value. | | __ge__(self, value, /) | Return self>=value. | | __getattribute__(self, name, /) | Return getattr(self, name). | | __getitem__(...) | x.__getitem__(y) <==> x[y] | | __gt__(self, value, /) | Return self>value. | | __init__(self, /, *args, **kwargs) | Initialize self. See help(type(self)) for accurate signature. | | __iter__(self, /) | Implement iter(self). | | __le__(self, value, /) | Return self<=value. | | __len__(self, /) | Return len(self). | | __lt__(self, value, /) | Return self<value. | | __ne__(self, value, /) | Return self!=value. | | __new__(*args, **kwargs) from builtins.type | Create and return a new object. See help(type) for accurate signature. | | __repr__(self, /) | Return repr(self). | | __setitem__(self, key, value, /) | Set self[key] to value. | | __sizeof__(...) | D.__sizeof__() -> size of D in memory, in bytes | | clear(...) | D.clear() -> None. Remove all items from D. | | copy(...) | D.copy() -> a shallow copy of D | | fromkeys(iterable, value=None, /) from builtins.type | Returns a new dict with keys from iterable and values equal to value. | | get(...) | D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. | | items(...) | D.items() -> a set-like object providing a view on D's items | | keys(...) | D.keys() -> a set-like object providing a view on D's keys | | pop(...) | D.pop(k[,d]) -> v, remove specified key and return the corresponding value. | If key is not found, d is returned if given, otherwise KeyError is raised | | popitem(...) | D.popitem() -> (k, v), remove and return some (key, value) pair as a | 2-tuple; but raise KeyError if D is empty. | | setdefault(...) | D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D | | update(...) | D.update([E, ]**F) -> None. Update D from dict/iterable E and F. | If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] | If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v | In either case, this is followed by: for k in F: D[k] = F[k] | | values(...) | D.values() -> an object providing a view on D's values | | ---------------------------------------------------------------------- | Data and other attributes defined here: | | __hash__ = None >>> dict3 = dict((('F',70),('i',105),('h',104),('c',67))) >>> dict3 {'F': 70, 'i': 105, 'h': 104, 'c': 67} >>> dict4=(小甲鱼='让编程改变世界',苍井空='让AV征服') SyntaxError: invalid syntax >>> KeyboardInterrupt >>> dict4=(小甲鱼='让编程改变世界',苍井空='让AV征服') SyntaxError: invalid syntax >>> KeyboardInterrupt >>> dict4=(小甲鱼='让编程改变世界',苍井空='让AV征服') SyntaxError: invalid syntax >>> dict4=dict(小甲鱼='让编程改变世界',苍井空='让AV征服') >>> dict4 {'小甲鱼': '让编程改变世界', '苍井空': '让AV征服'} >>> dict4['苍井空']='学习编程' >>> dict4 {'小甲鱼': '让编程改变世界', '苍井空': '学习编程'} >>> dict4['爱迪生']= '天才' >>> dict4 {'小甲鱼': '让编程改变世界', '苍井空': '学习编程', '爱迪生': '天才'} >>>

    P31 030文件系统:介绍一个高大上的东西1006

    >>> import random >>> secret =random.randint (1,10) >>> secret 6 >>> import os >>> os.getcwd() 'C:\\Users\\MR\\AppData\\Local\\Programs\\Python\\Python36' >>> os.chdir("E:") >>> od.listdir("E:") Traceback (most recent call last): File "<pyshell#37>", line 1, in <module> od.listdir("E:") NameError: name 'od' is not defined >>> os.listdir("E:") ['$RECYCLE.BIN', '360Downloads', '360驱动大师目录', 'code', 'Debug', 'Drivers', 'jianguoyun', 'Manual', 'QQMusicCache', 'record.txt', 'System Volume Information', 'test.txt', 'test_1.py.txt', '图片', '迅雷下载'] >>> os.dir("E:\\A") Traceback (most recent call last): File "<pyshell#39>", line 1, in <module> os.dir("E:\\A") AttributeError: module 'os' has no attribute 'dir' >>> os.mkdir("E:\\A") >>> os.mkdir("E:\\A\\B") >>> os.mkdir("E:\\C\\B") Traceback (most recent call last): File "<pyshell#42>", line 1, in <module> os.mkdir("E:\\C\\B") FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'E:\\C\\B' >>> os.rmdir("E:\\A\\B") Traceback (most recent call last): File "<pyshell#43>", line 1, in <module> os.rmdir("E:\\A\\B") OSError: [WinError 145] 目录不是空的。: 'E:\\A\\B' >>> os.remove("E:\\A\\B\\test.txt") >>> os.rmdir("E:\\A\\B") >>> os.system('cmd') -1073741510 >>> os.system('calc') 0 >>> os.curdir '.' >>> os.listdir(os.curdir) ['$RECYCLE.BIN', '360Downloads', '360驱动大师目录', 'A', 'code', 'Debug', 'Drivers', 'jianguoyun', 'Manual', 'QQMusicCache', 'record.txt', 'System Volume Information', 'test.txt', 'test_1.py.txt', '图片', '迅雷下载'] >>> os.path.basename('E:\\A\\B\\C\\sexy.avi') 'sexy.avi' >>> os.path.dirname('E:\\A\\B\\C\\sexy.avi') 'E:\\A\\B\\C' >>> os.path.join('A','B','C') 'A\\B\\C' >>> os.path.join('C:','A','B','C') 'C:A\\B\\C' >>> os.path.join('C:\\','A','B','C') 'C:\\A\\B\\C' >>> os.path.split('E:\\A\\B\\C') ('E:\\A\\B', 'C') >>> os.path.split('E:\\A\\B\\C\\test.avi') KeyboardInterrupt >>> os.path.split('E:\\A\\B\\C\\test.avi') ('E:\\A\\B\\C', 'test.avi') >>> os.path.splitext('E:\\A\\B\\C\\test.avi') ('E:\\A\\B\\C\\test', '.avi') >>> os.path.getatime('E:\\test.txt') 1601964171.0347624 >>> import time >>> time.gmtime (os.path.getatime('E:\\test.txt')) time.struct_time(tm_year=2020, tm_mon=10, tm_mday=6, tm_hour=6, tm_min=2, tm_sec=51, tm_wday=1, tm_yday=280, tm_isdst=0) >>> time.localtime (os.path.getatime('E:\\test.txt')) time.struct_time(tm_year=2020, tm_mon=10, tm_mday=6, tm_hour=14, tm_min=2, tm_sec=51, tm_wday=1, tm_yday=280, tm_isdst=0) >>> time.localtime (os.path.getmtime('E:\\test.txt')) time.struct_time(tm_year=2020, tm_mon=10, tm_mday=6, tm_hour=14, tm_min=2, tm_sec=51, tm_wday=1, tm_yday=280, tm_isdst=0) >>> time.localtime (os.path.getctime('E:\\test.txt')) time.struct_time(tm_year=2020, tm_mon=10, tm_mday=6, tm_hour=13, tm_min=15, tm_sec=14, tm_wday=1, tm_yday=280, tm_isdst=0) >>> E:\\A\\B\\TEST.TXT SyntaxError: unexpected character after line continuation character >>> E:\\A\\B\\TEST.TXT SyntaxError: unexpected character after line continuation character >>> E:\\A\\B\\TEST.txt SyntaxError: unexpected character after line continuation character >>> 'E:\\A\\B\\TEST.TXT' 'E:\\A\\B\\TEST.TXT' >>> os.path.ismount('E:\\') True >>> os.path.ismount('E:\\A') False >>>

    P32 031永久存储:研制一缸美味的泡菜1006

    >>> import pickle >>> my_list =[123,3.14,'xiaojiayu',['xnother list']] >>> pickle_file = open("my_list.pkl",'wb') >>> pickle.dump(my_list,pickle_file) >>> pickle_file.close() >>> pickle_file = open("my_list.pkl",'rb') >>> my_list2 = pickle.load(pickle_file) >>> print(my_list2) [123, 3.14, 'xiaojiayu', ['xnother list']]

    P33 032异常处理:你不可能总是对的1–1006

    file_name = input('请输入需要打开的文件名:') f = open(file_name,encoding='utf-8') print('文件的内容是:') for each_line in f: print(each_line)

    常见报错类型:

    >>> my_list = ['小甲鱼是帅哥'] >>> assert len(my_list) > 0 >>> my_list.pop() '小甲鱼是帅哥' >>> assert len(my_list) >0 Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> assert len(my_list) >0 AssertionError >>> my_list.fishc Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> my_list.fishc AttributeError: 'list' object has no attribute 'fishc' >>> my_list = [1,2,3] >>> my_liat[3] Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> my_liat[3] NameError: name 'my_liat' is not defined >>> my_list[2] 3 >>> my_dixt = {'one' : 1,'two':2,'three':3} >>> my_dict["one"] Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> my_dict["one"] NameError: name 'my_dict' is not defined >>> my_dict['one'] Traceback (most recent call last): File "<pyshell#10>", line 1, in <module> my_dict['one'] NameError: name 'my_dict' is not defined >>> my_dixt['one'] 1 >>> my_dixt['four'] Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> my_dixt['four'] KeyError: 'four' >>> my_dixt.get('four') >>> my_dixt {'one': 1, 'two': 2, 'three': 3} >>> fishc Traceback (most recent call last): File "<pyshell#15>", line 1, in <module> fishc NameError: name 'fishc' is not defined >>> print'i love' SyntaxError: invalid syntax >>> 1+'1' Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> 1+'1' TypeError: unsupported operand type(s) for +: 'int' and 'str' >>> 7/0 Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> 7/0 ZeroDivisionError: division by zero >>>

    P34 033异常处理:你不可能总是对的2–1006

    try: # int('abc') sum = 1 + '1' f = open('我为什么是一个文件.txt','r',encoding='utf-8') print(f.read()) f.close() except OSError as reason: print('文件出错啦\n错误的原因是'+str(reason)) except TypeError as reason: print('类型出错啦\n错误的原因是'+str(reason)) try: #int('abc') f = open('我为什么是一个文件.txt','w',encoding='utf-8') print(f.write('我存在了')) sum = 1 + '1' except OSError as reason: print('文件出错啦\n错误的原因是'+str(reason)) except TypeError as reason: print('类型出错啦\n错误的原因是'+str(reason)) finally: f.close() >>> 7/0 Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> 7/0 ZeroDivisionError: division by zero >>> raise ZeroDivisionError('除数为0的异常') Traceback (most recent call last): File "<pyshell#19>", line 1, in <module> raise ZeroDivisionError('除数为0的异常') ZeroDivisionError: 除数为0的异常

    P35 034丰富的else语句及简洁的with语句1006

    如果怎么样就干吧

    def showMaxFactor(num): count = num//2 while count > 1: if num %count ==0: print("%d最大的约数是%d"%(num,count)) break count -= 1 else: print('%d是素数!'%num) num = int(input('请输入一个数:')) showMaxFactor(num) try: # int('abc') int('123') except ValueError as reason: print('出错啦'+str(reason)) else: print('没有任何异常') # try: # f =open('data.txt','w',encoding='utf-8') # for each_line in f: # print(each_line) # except OSError as reason: # print('出错啦'+str(reason)) # finally: # f.close() try: with open('data.txt','w',encoding='utf-8') as f: for each_line in f: print(each_line) except OSError as reason: print('出错啦'+str(reason))

    P36 035图形用户界面入门:easygui1007

    安装easygui

    信了小甲鱼的‘鬼话’,以为要自己下载easygui,一看教程全部要在网上下载Python的工具包easygui-0.96或easygui-0.97,而这个工具包不是要fq到官网下载,就是要付费。。。既然白嫖当然要贯彻到底咯,功夫不负穷孩子,终于找到了一个直接cmd安装的,操作超级简单网址拿走不谢

    不过以防万一,附上我的所有骚操作,害怕疏漏,我是先安装的pycharm中的easygui最后直接命令行接着上面网址的输入pip,没有下载pip,就显示已有。 就大功告成了,不知道有没有关系

    pycharm中easygui安装的方法

    file->settings->project:->project interpreter 右侧加号+ 搜索 easygui,点击instal安装即可 import easygui as g import sys while 1: g.msgbox('hi,欢迎进入第一个界面小游戏') msg = '请问你希望在工作室学到什么知识呀?' title = '小游戏互动' choices = ['谈恋爱','编程','emm','琴棋书画'] choice = g.choicebox(msg,title,choices) #note that we convert choice to string, in case #the user canceled the choice, and we got none. g.msgbox('你的选择是:'+str(choice),'结果') msg = '你希望重新开始小游戏吗' title = '请选择' if g.ccbox(msg,title): #show a continue/cancel dialog pass #user chose continue else: sys.exit(0)#user chose cancel

    P37 036类和对象:给大家介绍对象1007

    对象= 属性+方法

    class Turtle:#python 中的类名约定以大写字母开头 # ===关于类的一个简单例子=== #属性 color = 'green' weight = 10 legs = 4 shell = True mouth = '大嘴' #方法 def climb(self): print('我正在努力的向前爬') def run(self): print('我正在飞快的向前跑') def bite(self): print('咬死你') def eat(self): print('有的吃满足。。') def sleep(self): print('困了') >>> import turtle >>> tt = Turtle() Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> tt = Turtle() NameError: name 'Turtle' is not defined >>> tt = Turtle() Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> tt = Turtle() NameError: name 'Turtle' is not defined >>> Turtle() Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> Turtle() NameError: name 'Turtle' is not defined >>> Turtle().climb() Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> Turtle().climb() NameError: name 'Turtle' is not defined >>> import Turtle Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> import Turtle ModuleNotFoundError: No module named 'Turtle' >>> import turtle >>> tt = turtle() Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> tt = turtle() TypeError: 'module' object is not callable >>> === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy036.py === >>> tt = Turtle() >>> Turtle() <__main__.Turtle object at 0x00000210B04396A0> >>> tt.climb() 我正在努力的向前爬 >>> tt.bite() 咬死你 >>> tt.sleep() 困了 >>>

    我可能就是传说中的憨憨本人了,这个地方小甲鱼明明是运行了第一个Turtle()文件,我以为他是在交互页面,害,听课不积极,早晚出问题。 继承

    >>> list1=[2,1,3,5,7] >>> list.sort() Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> list.sort() TypeError: descriptor 'sort' of 'list' object needs an argument >>> list1.sort() >>> list1 [1, 2, 3, 5, 7] >>> list1.append(9) >>> liat1 Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> liat1 NameError: name 'liat1' is not defined >>> list1 [1, 2, 3, 5, 7, 9] >>> class Mylist(list): pass >>> list2 = Mylist() >>> list2.append(5) >>> list2 [5] >>> list2.append(2) >>> list.sort()#排序 Traceback (most recent call last): File "<pyshell#27>", line 1, in <module> list.sort() TypeError: descriptor 'sort' of 'list' object needs an argument >>> list2.sort() >>> list2 [2, 5]

    多态:不同对象对同一方法响应不同的行动

    >>> class A: def fun(self): print('我是小啊') >>> class B: def fun(self): print('我是小兵') >>> a=A() >>> b=B() >>> a.fun() 我是小啊 >>> a.fun() 我是小啊 >>> b.fun() 我是小兵 >>>

    P38 037类和对象:面向对象编程1008

    self是什么?

    >>> class Ball: def setName(self, name): self.name = name def kick(self): print("我叫%s,该死的,谁踢我"% self.name) >>> a= Ball() >>> a.setName('球a') >>> a.kick() 我叫球a,该死的,谁踢我 __init__(self,param1,param2...) >>> class Ball: def __init__(self,name): self.name = name def kick(self): print("我叫%s,该死的,谁踢我"% self.name) >>> b=Ball('tomato') >>> b.kick() 我叫tomato,该死的,谁踢我 >>> >>> class Person: name = '小甲鱼' >>> p = Person() >>> p,name Traceback (most recent call last): File "<pyshell#75>", line 1, in <module> p,name NameError: name 'name' is not defined >>> p.name() Traceback (most recent call last): File "<pyshell#76>", line 1, in <module> p.name() TypeError: 'str' object is not callable >>> p.name '小甲鱼' >>> class Person: __name = '小甲鱼'#公有变私有 >>> p = Person() >>> p.name Traceback (most recent call last): File "<pyshell#81>", line 1, in <module> p.name AttributeError: 'Person' object has no attribute 'name' >>> class Person: __name = '小甲鱼' def getName(self): return self._name#应该是双下划线 >>> p=Person() >>> p.name Traceback (most recent call last): File "<pyshell#87>", line 1, in <module> p.name AttributeError: 'Person' object has no attribute 'name' >>> p.getName() Traceback (most recent call last): File "<pyshell#88>", line 1, in <module> p.getName() File "<pyshell#85>", line 4, in getName return self._name AttributeError: 'Person' object has no attribute '_name' >>> class Person: __name = '小甲鱼' def getName(self): return self.__name >>> p = Person() >>> p.name Traceback (most recent call last): File "<pyshell#92>", line 1, in <module> p.name AttributeError: 'Person' object has no attribute 'name' >>> p.getName() '小甲鱼' >>> p._Person__name '小甲鱼'

    P39 038类和对象:继承1008

    class DerivedClassName(BaseClassName): import random as r class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) def move(self): self.x -= 1 print('我的位置是', self.x,self.y) class Goldfish(Fish): pass class Carp(Fish): pass class Salmon(Fish): pass class Shark(Fish): def __init__(self): self.hungry = True def eat(self): if self.hungry: print('吃货的梦想天天有的吃') self.hungry =False else: print('太撑了吃不下') >>> fish = Fish() >>> fish.move() 我的位置是 8 7 >>> fish.move() 我的位置是 7 7 >>> goldfish=Goldfish() >>> goldfish.move() 我的位置是 6 4 >>> gildfish.move() Traceback (most recent call last): File "<pyshell#118>", line 1, in <module> gildfish.move() NameError: name 'gildfish' is not defined >>> goldfish.move() 我的位置是 5 4 >>> shark = Shark() >>> shark.eat() 吃货的梦想天天有的吃 >>> shark.eat() 太撑了吃不下 >>> shark.move() Traceback (most recent call last): File "<pyshell#123>", line 1, in <module> shark.move() File "C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy038.py", line 10, in move self.x -= 1 AttributeError: 'Shark' object has no attribute 'x' >>>

    发现shark位置函数报错,原因是子类将父类函数覆盖了,改进方法:

    import random as r class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) def move(self): self.x -= 1 print('我的位置是', self.x,self.y) class Goldfish(Fish): pass class Carp(Fish): pass class Salmon(Fish): pass class Shark(Fish): def __init__(self): # Fish.__init__(self) super().__init__() self.hungry = True def eat(self): if self.hungry: print('吃货的梦想天天有的吃') self.hungry =False else: print('太撑了吃不下')

    运行结果

    === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy038.py === >>> shark = Shark() >>> shark.move() 我的位置是 1 4 >>> Fish.__init__(shark) >>> shark.move() 我的位置是 0 0 >>> Fish.__init__() Traceback (most recent call last): File "<pyshell#128>", line 1, in <module> Fish.__init__() TypeError: __init__() missing 1 required positional argument: 'self' >>> === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy038.py === >>> shark = Shark() Traceback (most recent call last): File "<pyshell#129>", line 1, in <module> shark = Shark() File "C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy038.py", line 23, in __init__ super()>__init__() NameError: name '__init__' is not defined >>> === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy038.py === >>> shark = Shark() >>> shark.move() >>> class Base1: def fool(self): print("我是fool,我为Base1代言") >>> class Base2: def foo2(self): print("我是foo2,我为Base2代言") >>> class C(Base1,Base2): pass >>> c=C() >>> c.fool() 我是fool,我为Base1代言 >>> c.foo2() 我是foo2,我为Base2代言

    P40 039类和对象:拾遗1008

    组合

    案例:

    class Turtle: def __init__(self,x): self.num = x class Fish: def __init__(self,x): self.num = x class Pool: def __init__(self,x,y): self.turtle = Turtle(x) self.fish = Fish(y) def print_num(self): print("水池里总共有乌龟%d 只,鱼 %d 条"%(self.turtle.num,self.fish.num))

    输出:

    === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy039.py === >>> pool = Pool(1,10) >>> pool.print_num() 水池里总共有乌龟1 只,鱼 10

    类、类对象和实例对象

    >>> class C: count = 0 >>> a=C() >>> b=C() >>> c=C() >>> a.count 0 >>> b.count 0 >>> c.count 0 >>> c.count += 10 >>> c.count 10 >>> a.count 0 >>> b.count 0 >>> C.count 0 >>> C.count += 10 >>> a.count 10 >>> C.count = 100 >>> a.count 100 >>> b.count 100 >>> c.count 10 >>> class C: def x(self): print("X-man") >>> c=C() >>> c.x() X-man >>> c.x=1 >>> c.x 1 >>> c.x() Traceback (most recent call last): File "<pyshell#174>", line 1, in <module> c.x() TypeError: 'int' object is not callable >>> class BB: def printBB(): print('no zuo no die') >>> BB.printBB() no zuo no die >>> bb = BB() >>> bb.printBB() Traceback (most recent call last): File "<pyshell#181>", line 1, in <module> bb.printBB() TypeError: printBB() takes 0 positional arguments but 1 was given >>> class CC: def setXY(self, x, y): self.x = x self.y = y def printXY(self): print(self.x,self.y) >>> dd = CC() >>> dd.__dict__ {} >>> CC.__dict__ mappingproxy({'__module__': '__main__', 'setXY': <function CC.setXY at 0x0000022AB8990510>, 'printXY': <function CC.printXY at 0x0000022AB8990598>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}) >>> dd.setXY(4,5) >>> dd.__dict__ {'x': 4, 'y': 5} >>> CC.__dict__ mappingproxy({'__module__': '__main__', 'setXY': <function CC.setXY at 0x0000022AB8990510>, 'printXY': <function CC.printXY at 0x0000022AB8990598>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}) >>> del CC >>> ee = CC() Traceback (most recent call last): File "<pyshell#196>", line 1, in <module> ee = CC() NameError: name 'CC' is not defined >>> dd.printXY() 4 5 >>>

    P41 040类和对象:一些相关的BIF1008

    #issubclass() >>> class A: pass >>> class B(A): pass >>> issubclass(B,A) True >>> issubclass(B,B) True >>> issubclass(B,object) True >>> class C: pass >>> issubclass(B,C) False #isinstance(object,classinfo) >>> b1=B() >>> isinstance(b1,B) True >>> isinstance(b1,A) True >>> isinstance(b1,C) False >>> isinstance(b1,(A,B,C)) True #hasattr(object,name)用于判断对象是否包含对应的属性 >>> def __init__(self,x=0): self.x = x >>> c1=C() >>> hasattr(c1,x) Traceback (most recent call last): File "<pyshell#222>", line 1, in <module> hasattr(c1,x) NameError: name 'x' is not defined >>> hasattr(c1,'x') True #getattr(object,name[,default]) >>> getattr(c1,'x') 0 >>> getattr(c1,'y') Traceback (most recent call last): File "<pyshell#225>", line 1, in <module> getattr(c1,'y') AttributeError: 'C' object has no attribute 'y' >>> getattr(c1,'y','您所访问的属性不存在') '您所访问的属性不存在' #setattr(object,name,value) #delattr(object,name) >>> setattr(c1,'y','fishc') >>> getattr(c1,'y','您所访问的属性不存在') 'fishc' >>> delattr(c1,'y') >>> >>> getattr(c1,'y','您所访问的属性不存在') '您所访问的属性不存在' >>> class C: def __init__(self,size = 10): self.size = size def getSize(self): return self.size def setSize(self,value): self.size = value def delSize(self): del self.size x = property(getSize,setSize,delSize) >>> cl = C() >>> c1.getSize() Traceback (most recent call last): File "<pyshell#245>", line 1, in <module> c1.getSize() AttributeError: 'C' object has no attribute 'getSize' >>> c1=C() >>> c1.getSize() 10 >>> c1.x 10 >>> c1.x = 18 >>> c1.x 18 >>> c1.size 18 >>> c1.getSize() 18 >>> del c1.x >>> c1.size Traceback (most recent call last): File "<pyshell#254>", line 1, in <module> c1.size AttributeError: 'C' object has no attribute 'size' >>>

    P42 041魔法方法:构造和析构1009

    魔法方法总是被双下划线包围,例如__init__

    #__init__(self[,...]) >>> class Rectangle: def __init__(self,x,y): self.x = x self.y = y def getPeri(self): return(self.x+self.y)*2 def getArea(self): return self.x*self.y >>> rect = Rectangle(3,4) >>> rect.getPeri() 14 >>> >>> rect.getArea() 12 >>> class A: def __init__(self): return 'A for Acup' >>> a=A() Traceback (most recent call last): File "<pyshell#23>", line 1, in <module> a=A() TypeError: __init__() should return None, not 'str' #__new__(cls[,...]) >>> class CapStr(str): def __new__(cls,string): string = string.upper() return str.__new__(cls,string) >>> a = CapStr('I love fish') >>> a 'I LOVE FISH' #__del__(self) >>> class C: def __init__(self): print('i am __init__我被调用了') def __del__(self): print('i am __del__我被调用了') >>> c1=C() i am __init__我被调用了 >>> c2=c1 >>> c3=c2 >>> del c3 >>> del c2 >>> del c1 i am __del__我被调用了 >>>

    P43 042魔法方法:算术运算1–1009

    >>> type(len) <class 'builtin_function_or_method'> >>> type(dir) <class 'builtin_function_or_method'> >>> type(int) <class 'type'> >>> type(list) <class 'type'> >>> class C: pass >>> type(C) <class 'type'> >>> a= int('123') >>> a 123 >>> b=int('456') >>> a+b 579 >>> class New_int(int): def __add__(self,other): return int.__sub__(self,other) def __sub__(self,other): return int.__add__(self,other) >>> a = New_int(3) >>> b=New_int(5) >>> a+b -2 >>> a-b 8 >>> class Try_int(int): def __add__(self,other): return self+other def __sub__(self,other) SyntaxError: invalid syntax >>> class Try_int(int): def __add__(self,other): return self+other def __sub__(self,other): return self-other >>> a = Try_int(3) >>> b = Try_int(5) >>> a+b Traceback (most recent call last): File "<pyshell#30>", line 1, in <module> a+b File "<pyshell#27>", line 3, in __add__ return self+other File "<pyshell#27>", line 3, in __add__ return self+other File "<pyshell#27>", line 3, in __add__ return self+other [Previous line repeated 328 more times] RecursionError: maximum recursion depth exceeded while calling a Python object >>> class Try_int(int): def __add__(self,other): return int(self)+int(other) def __sub__(self,other): return int(self)-int(other) >>> a = Try_int(3) >>> b = Try_int(5) >>> a+b 8 >>>

    P44 043魔法方法:算数运算2–1010

    >>> class int(int): def __add__(self,other): return int.__sub__(self,other) >>> a = int('5') >>> a 5 >>> b=int(3) >>> a+b 2 >>> =============================== RESTART: Shell =============================== >>> class Nint(int): def __radd__(self,other): return int.__sub__(self,other) >>> a=Nint(5) >>> b=Nint(3) >>> a+b 8 >>> 1+b 2 >>> =============================== RESTART: Shell =============================== >>> class Nint(int): def __rsub__(self,other): return int.__sub__(self,other)#注意次序 >>> a=Nint(5) >>> 3-a#先返回self后是other所以变成了self-other 2

    P45 044魔法方法:简单定制1010

    案例:

    import time as t class MyTimer(): def __init__(self): self.prompt = '未开始计时' self.lasted = [] self.start = 0 self.stop = 0 def __str__(self): return self.prompt __repr__ = __str__ #开始计时 def start(self): self.start = t.localtime() print('计时开始') #停止计时 def stop(self): self.stop = t.localtime() self._calc() print('计时结束 ') #内部方法计算运行时间 def _calc(self): self.lasted = [] self.prompt = '总共运行了' for index in range(6): self.lasted.append(self.stop[index] - self.start[index]) self.prompt += str(self.lasted[index]) # print(self.prompt)

    结果:

    === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36 === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy044.py === >>> t1 = MyTimer() >>> t1 未开始计时 >>> t1.start() Traceback (most recent call last): File "<pyshell#28>", line 1, in <module> t1.start() TypeError: 'int' object is not callable#原因:将start进行初始化,默认为int型,进而属性覆盖方法

    改进:

    import time as t class MyTimer(): def __init__(self): self.prompt = '未开始计时' self.lasted = [] self.begin = 0 self.end = 0 def __str__(self): return self.prompt __repr__ = __str__ #开始计时 def start(self): self.begin = t.localtime() print('计时开始') #停止计时 def stop(self): self.end = t.localtime() self._calc() print('计时结束 ') #内部方法计算运行时间 def _calc(self): self.lasted = [] self.prompt = '总共运行了' for index in range(6): self.lasted.append(self.end[index] - self.begin[index]) self.prompt += str(self.lasted[index]) # print(self.prompt)

    结果:

    === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy044.py === >>> t1 = MyTimer() >>> t1 未开始计时 >>> t1.start <bound method MyTimer.start of 未开始计时> >>> t1.start() 计时开始 import time as t class MyTimer(): def __init__(self): self.unit = ['年','月','天','小时','分钟','秒'] self.prompt = '未开始计时' self.lasted = [] self.begin = 0 self.end = 0 def __str__(self): return self.prompt __repr__ = __str__ def __add__(self,other): prompt = "总共运行了" result =[] for index in range(6): result.append(self,lasted[index] +other.lasted[index]) if result[index]: prompt += (str(result[index])+self.unit[index]) return prompt #开始计时 def start(self): self.begin = t.localtime() self.prompt = "提示:请先用stop()停止计时" print('计时开始') #停止计时 def stop(self): if not self.begin: print('请先调用start()进行计时') else: self.end = t.localtime() self._calc() print('计时结束 ') #内部方法计算运行时间 def _calc(self): self.lasted = [] self.prompt = '总共运行了' for index in range(6): self.lasted.append(self.end[index] - self.begin[index]) if self.lasted[index]: self.prompt += (str(self.lasted[index])+self.unit[index]) # print(self.prompt) #为下一轮计时初始化变量 self.begin = 0 self.end = 0

    运行:

    === RESTART: C:/Users/MR/AppData/Local/Programs/Python/Python36/xjy044.py === >>> t1 = MyTimer() >>> t1.stop() 请先调用start()进行计时 >>> t1.start() 计时开始 >>> t1 提示:请先用stop()停止计时 >>> t1.stop() 计时结束 >>> t1 总共运行了1分钟-52

    P46 045魔法方法:属性访问1011

    >>> class C: def __init__(self): self.x ='x_man' >>> c=C() >>> c.x 'x_man' >>> getattr(c,'x','无此属性') 'x_man' >>> getattr(c,'y','无此属性') '无此属性' >>> class C(): def __init__(self,size=10): self.size =size def getSize(self): return self.size def setSize(self,value): self.size = value def delSize(self): del self.size x=property(getSize,setSize,delSize) >>> c=C() >>> c.x=1 >>> c.x 1 >>> del c.size >>> c.x Traceback (most recent call last): File "<pyshell#28>", line 1, in <module> c.x File "<pyshell#23>", line 5, in getSize return self.size AttributeError: 'C' object has no attribute 'size' >>> class C: def __getattribute__(self,name): print("getattribute") return super().__getattribute__(name) def __getattr__(self,name): print("getattr") def __setattr__(self,name,value): print("setattr") return super().__setattr__(name,value) def __delattr__(self,name): print("delattr") super().__delattr__(name) >>> c=C() >>> c.x getattribute getattr >>> c.x=1 setattr >>> c.x getattribute 1 >>> del c.x delattr

    案例:

    class Rectangle: def __init__(self,width=0,height=0): self.width = width self.height = height def __setattr__(self, key, value): if key == 'square': self.width = value self.height = value else: 'super().__setattr__(key,value)' self.__dict__[key] = value def getArea(self): return self.width * self.height

    输出:

    >>> r1=Rectangle(4,5) >>> r1.getArea() 20 >>> r1.square = 10 >>> r1.width 10 >>> r1.height 10 >>> r1.getArea() 100

    P47 046魔法方法:描述符1024

    P42# P42

    Processed: 0.011, SQL: 8