狐狸1 发表于 2020-2-18 11:55:58

我的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

理想小青年 发表于 2020-2-18 11:58:51

{:10_256:}好好加油

Sungne_jer 发表于 2020-2-18 12:36:08

加油!

狐狸1 发表于 2020-2-19 09:41:24

本帖最后由 狐狸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:30:50

本帖最后由 狐狸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__()方法,应调用成功,但结果却并不如意
进来看的鱼友能帮忙解答一下吗?


狐狸1 发表于 2020-2-19 11:14:56

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}


狐狸1 发表于 2020-2-19 11:17:59

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}

狐狸1 发表于 2020-2-19 11:32:49

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)
#可控

dxr001 发表于 2020-2-19 14:39:11

狐狸1 发表于 2020-2-19 09:41
2020/2/19
描述符(property)的原理



很棒

狐狸1 发表于 2020-2-20 10:15:04

2020/2/20

今天出研究生初试成绩,好紧张

狐狸1 发表于 2020-2-20 11:53:25

学不下去,淦

SwallowGong 发表于 2020-2-21 10:20:39

加油~

狐狸1 发表于 2020-2-21 22:08:08

自闭了但还要接着学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:26:44

狐狸1 发表于 2020-2-21 22:08
自闭了但还要接着学python。
2020/2/21



ohhhhhhhhhhh,感觉很厉害的样子

狐狸1 发表于 2020-2-21 22:55:06

2020/2/21

if__name__ == '__main__'
    text()#text()在上面额外定义
*如果name 是等于模块名,呐整个if加text是作为模块导入,可专门用来测试。

**搜索路径,用append()

***包(package)
1,创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字。
2,在文件夹中创建一个__init__.py的模块文件,内容可以为空(规定)
3,将相关的模块放入文件夹
导入方法:import 包名.模块名

狐狸1 发表于 2020-2-22 11:34:33

2020/2/22
爬虫1

URL的一般格式为(带方括号的为可选项):
protocol://hostname[:port]/path/[;parameters][?query]#fragment

URL由三部分:
*第一部分是协议:http,https,ftp,file,ed2k
*第二部分是存放资源的服务器的域名系统或IP地址(有时候要包含端口号,各种传输协议都有默认的端口号,如http的默认端口为80)
*第三部分是资源的具体地址,如目录或文件名等

试着爬了b站,很后悔

狐狸1 发表于 2020-2-22 12:08:24

2020/2/22
爬虫2 看不太懂,就获取了一下一张猫片,后面明天再看一遍。{:10_266:}

狐狸1 发表于 2020-2-22 17:21:42

成功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']))

狐狸1 发表于 2020-2-22 17:22:36

成功:
代码:
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 发表于 2020-2-22 17:28:50

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
查看完整版本: 我的python自学路