我的python自学路
今天开始记录每天学习的python内容。2020/2/18
属性访问
1,__gerattr__(self,name) #定义当用户试图获取一个不存在的属性时的行为
2,__getattribute__(self,name) #定义当该类的属性被访问时的行为
3,__setattr__(self,name,value) #定义当一个属性被设置时的行为
4,__delattr__(self,name)#定义当一个属性被删除时的行为
注意:死循环陷阱
例题:写一个矩形类,默认有宽和高两个属性。如果为一个叫square的属性赋值,那么说明这是一个正方形,值就是正方形的边长,此时宽和高都应该等于边长。
代码:
class Rectangle:
def __init__(self,width=0,height=0):
self.width = width
self.height = height
def __setattr__(self,name,value):
if name == "square":
self.width = value
self.height = value
else:
#self.name = value #这里的name 其实是上面的width,所以会一直自己调用自己,是错误用法
#更改后
#super().__setattr__(name,value) #调用基类
self.__dict__ = value #设成字典形式
def getArea(self):
return self.width*self.height
{:10_256:}好好加油 加油! 本帖最后由 狐狸1 于 2020-2-19 10:03 编辑
2020/2/19
描述符(property)的原理
*描述符就是将某种特殊类型的类的实例指派给另一个类的属性
*特殊类型的类要实行以下三种方法中的一个或多个方法:
*__get__(self,instance,owner) #用于访问属性,它返回属性的值
*__set__(self,instance,value) #将在属性分配操作中调用,不返回任何内容
*__delete__(self,instance) #控制删除操作,不返回任何内容
例子:
class MyDecriptor:
def __get__(self,instance,owner):
print('getting',self,instance,owner)
def __set__(self,instance,value):
print('settting',self,instance,value)
def __delete__(self,instance):
print('deleting',self,instance)
class Text:
x = MyDecriptor()
text = Text()
text.x
text.x = 'X-main'
del text.x
#输出结果为:
getting <__main__.MyDecriptor object at 0x03525F70> <__main__.Text object at 0x033DAE08> <class '__main__.Text'>
settting <__main__.MyDecriptor object at 0x039DB5B0> <__main__.Text object at 0x03A25F70> X-main
deleting <__main__.MyDecriptor object at 0x039DB5B0> <__main__.Text object at 0x03A25F70>
本帖最后由 狐狸1 于 2020-2-19 10:45 编辑
将华氏度转换成摄氏度
代码:
class Celsius:
def __init__(self,value=26.0):
self.value = float(value)
def __get__(self,instance,owner):
return self.value
def __set__(self,instance,value):
self.value = float(value)
class Fahrenheit:
def __get(self,instance,owner):
return instance.cel * 1.8 + 32
def __set__(self,instance,value):
instance.cel = (float(value) - 32) / 1.8
class Temperature:
cel = Celsius()
fah = Fahrenheit()
#结果出现问题
temp.fah = 100
temp.cel
37.77777777777778
#华氏度能顺利转化为摄氏度
temp.cel = 37
>>> temp.fah
<__main__.Fahrenheit object at 0x03F320D0>
#摄氏度未能顺利转化为华氏度
思考:当我输入temp.cel = 37时,调用了Celsius的__set__()方法,self.value被赋值37(浮点数),然后我再调用temp的fah属性,此时是调用了Fahrenheit的__get__()方法,应调用成功,但结果却并不如意
进来看的鱼友能帮忙解答一下吗?
2020/2/19
定制序列
*容器类型的协议
*如果说希望定制一个不可变的容器,只需定义__len__()和__getitem__()方法。
*如果希望定制的容器是可变的,除了__len__()和__getitem__()方法,还需定义__setitem__()和__delitem__()两个方法。
练习:编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数
#一个介绍推导式的博客链接:https://www.cnblogs.com/tkqasn/p/5977653.html
class CountList:
def __init__(self,*args):
self.values =
self.count = {}.fromkeys(range(len(self.values)),0)
def __len__(self):
return len(self,values)
def __getitem__(self,key):
self.count += 1
return self.values
c1 = CountList(1,3,5,7,9)
>>> c2 = CountList(2,4,6,8,10)
>>> c1
3
>>> c1.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}
2020/2/19
定制列表
*容器定制的协议
*如果你希望定制的容器是不可变的话,你只需要定义__len__()和__getitem__()方法
*如果希望定制的容器是可变的话,除了要定义__len__()和__getitem__()方法外,还要定义__setitem__()和__getitem__()方法
练习:定制一个不可变的列表
class CountList:
def __init__(self,*args):
self.values =
self.count = {}.fromkeys(range(len(self.values)),0)
def __len__(self):
return len(self,values)
def __getitem__(self,key):
self.count += 1
return self.values
c1 = CountList(1,3,5,7,9)
>>> c2 = CountList(2,4,6,8,10)
>>> c1
3
>>> c1.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}
2020/2/19
迭代器
两个内置函数iter(),next()
斐波那锲函数
class Fibs:
def __init__(self,n=10):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a,self.b = self.b,self.a + self.b
if self.a>self.n:
raise StopIteration
return self.a
fibs = Fibs()
for each in fibs:
print(each)
#可控 狐狸1 发表于 2020-2-19 09:41
2020/2/19
描述符(property)的原理
很棒 2020/2/20
今天出研究生初试成绩,好紧张 学不下去,淦 加油~ 自闭了但还要接着学python。
2020/2/21
生成器
*所谓的协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。
例子:
def mygen():
print("生成器被执行")
yield 1 #执行到这里就会自动停止运行
yield 2
myg=mygen()
>>> next(myg)
生成器被执行
1
>>> next(myg)
2
>>> next(myg)
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
next(myg)
StopIteration
#next()是执行生成器的一个方法
for i in mygen():
print(i)
#结果
生成器被执行
1
2
**以前天的斐波那契为例
def libs():
a = 0
b = 1
while True:
a, b=b,a+b
yield a
for each in libs():
if each > 100 :
break
print(each,end=" ")
#结果顺利
1 1 2 3 5 8 13 21 34 55 89
#逻辑:for each in libs():调用libs()函数,while True:永远为真,a赋值为b(1),b赋值为a+b(1),挂起a=1,则each 取值为1,小于100,循环继续,这次循环是绕过初始值,直接在yield后继续,也即是在while循环继续。 狐狸1 发表于 2020-2-21 22:08
自闭了但还要接着学python。
2020/2/21
ohhhhhhhhhhh,感觉很厉害的样子 2020/2/21
if__name__ == '__main__'
text()#text()在上面额外定义
*如果name 是等于模块名,呐整个if加text是作为模块导入,可专门用来测试。
**搜索路径,用append()
***包(package)
1,创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字。
2,在文件夹中创建一个__init__.py的模块文件,内容可以为空(规定)
3,将相关的模块放入文件夹
导入方法:import 包名.模块名 2020/2/22
爬虫1
URL的一般格式为(带方括号的为可选项):
protocol://hostname[:port]/path/[;parameters][?query]#fragment
URL由三部分:
*第一部分是协议:http,https,ftp,file,ed2k
*第二部分是存放资源的服务器的域名系统或IP地址(有时候要包含端口号,各种传输协议都有默认的端口号,如http的默认端口为80)
*第三部分是资源的具体地址,如目录或文件名等
试着爬了b站,很后悔 2020/2/22
爬虫2 看不太懂,就获取了一下一张猫片,后面明天再看一遍。{:10_266:} 成功pa
import urllib.request
import urllib.parse
import json
content = input('请输入要输入的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'utf-8'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
target = json.loads(html)
print('翻译结果:%s' % (target['translateResult']['tgt']))
成功:
代码:
import urllib.request
import urllib.parse
import json
content = input('请输入要输入的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'utf-8'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
target = json.loads(html)
print('翻译结果:%s' % (target['translateResult']['tgt']))
import urllib.request
import urllib.parse
import json
content = input('请输入要输入的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'utf-8'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
target = json.loads(html)
print('翻译结果:%s' % (target['translateResult']['tgt']))
页:
[1]
2