Python—实训day3—简单的在线翻译程序

4 发送POST请求

4.3 用poster获取有道在线翻译

参考有道翻译:http://fanyi.youdao.com/

通过Fiddler工具可以获取到

请求的URL地址为:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

提交的请求体参数

i=hello&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt=16002154063071&sign=37d97277cb051e71959e772b91309b2b&lts=1600215406307&bv=7e14dfdb6b3686cc5af5e5294aaded19&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_REALTlME

其中,关键参数:

i:要翻译的单词

salt:盐值

sign:签名

盐值和签名是后台反爬虫的机制

使用poster来模拟发送post请求

但是会出现 {"errorCode":50} 错误,因为服务器有反爬虫机制

只要盐值和签名不同,就会报错

经过网上大神指点,把translate_o改为translate即可

4.4 用python实现简单的在线翻译程序

from urllib import request, parse
import ssl
import random

# 常用User-Agent列表
ua_list = [
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
    'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12',
    'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',
]
# 加载一个页面
def loadPage(url, word):
    # 在ua_list列表中随机选择一个UserAgent
    userAgent = random.choice(ua_list)
    headers = {
        'User-Agent': userAgent
    }
    # 发起一个请求
    req = request.Request(url, headers = headers)
    # 创建未经过验证的上下文的代码
    context = ssl._create_unverified_context()
    data = {
        'i': word,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': '16002154063071',
        'sign': '37d97277cb051e71959e772b91309b2b',
        'lts': '1600215406307',
        'bv': '7e14dfdb6b3686cc5af5e5294aaded19',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME'
    }
    data = parse.urlencode(data).encode('utf-8')
    # 打开响应的对象
    response = request.urlopen(req, context=context, data=data)
    # 获取响应的内容
    html = response.read()
    # 对获取到的unicode编码进行解码
    content = html.decode('utf-8')

    return content
import json
def fanyi(word):
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    content = loadPage(url, word)
    jsondicts = json.loads(content)
    return jsondicts['translateResult'][0][0]['tgt']

if __name__ == '__main__':
    word = input('请输入要翻译的单词:')
    result = fanyi(word)
    print('翻译的结果为:', result)

5.1 面向对象和面向过程5 Python面向对象

面向过程:C、汇编、Basic、Pascal

面向对象:C++、Java、Python、PHP、……

面向过程基于计算机的角度出发考虑问题

面向对象是从人(第三者)的角度出发考虑问题

比如:学生上学

面向过程

起床

洗刷刷

穿衣打扮

出门,往教室方向走

if 遇到十字路口:

while 红灯亮:

等待绿灯

走到教室

while 上课时间未到:

等待上课

开始上课

while 下课时间未到:

等待下课

走出教室

吃饭

睡觉

面向对象

定义一个学生类

定义学生类的属性:姓名、年龄、专业、年级、……

定义学生类的方法:吃饭()、睡觉()、上学()、放学()、……

定义一个教室类

定义教室类的属性:位置、容量、……

定义教室类的方法:开门()、关门()

定义学生类的对象:zhangsan

定义教室类的对象:417

zhangsan.上学(417)

总结:

面向对象:适合组织大规模的软件开发

面向过程:底层、快捷、高效

5.2 什么是对象

天上飞的:飞机、大炮、鸟、鹰、……

地上跑的:鸡鸭鹅、猪牛羊

水里游的:鱼虾蟹、……

抽象的概念:项目、规范、原理、方法、……

世界上万事万物都是对象

5.3 区分类和对象

思考:

1 狗是类 狗是对象

2 张三是类 张三是对象

结论:对象更具体、类更抽象

一个类中可以包含多个对象

类是某一种对象的集合(总称)

面向对象编程

5.4 Python中声明类和创建对象

声明类:使用关键字 class

约定规矩:类名首字母必须大写

# 声明一个类
class Dog:
    pass

创建类的对象

dog1 = Dog()
print(dog1) # ain__.Dog object at 0x000002AEA3FDFA58>
print(type(dog1)) # s '__main__.Dog'>

Dog是类,dog1是Dog的对象

我们是面向对象的编程,实际上是使用dog1进行编程

5.5 属性

属性是对象所拥有的特征

设置属性

# 声明一个类
class Dog:
    pass
dog1 = Dog()
# 设置狗的属性
dog1.name = '旺财'
dog1.age = 13
dog1.sex = 'male'
# 读取狗的属性
print(dog1.name)
print(dog1.age)
print(dog1.sex)

如果想要查看类的属性和方法,可以通过dir() 函数查看

dog1 = Dog()
print(dir(dog1))
# 设置狗的属性
dog1.name = '旺财'
dog1.age = 13
dog1.sex = 'male'
print(dir(dog1))

http://note.youdao.com/yws/public/resource/00046a0c97ba3ff9a8ba218269d3a3ec/xmlnote/40A6FF2D606B471191ED3F53644CBDFE/35992

发现属性是临时添加上去的

如果希望属性是固定在类中的,需要把这些属性写到类的实现代码中

class Dog:
    name = '' # 姓名
    age = 0 # 年龄
    sex = 'female' # 性别

dog1 = Dog()
print(dir(dog1))
dog2 = Dog()
print(dir(dog2))

http://note.youdao.com/yws/public/resource/00046a0c97ba3ff9a8ba218269d3a3ec/xmlnote/8CF22E86FD704615A4911BFF6D1C0A09/36001

5.6 方法

方法是类的对象的一系列的操作

需要在类中定义方法

def 方法名(方法的参数):

方法的实现代码

方法的返回值

注意:方法名首字母必须小写

class Dog:
    # 狗叫的方法
    def bark(self):
        print('旺')

dog1 = Dog()
dog1.bark()

方法可以传递参数

class Dog:
    # 狗叫的方法
    def bark(self):
        print('旺')
    def eat(self, something):
        print('狗吃' + something)

dog1 = Dog()
dog1.bark()
dog1.eat('骨头')

给方法加上返回值

class Dog:
    name = ''
    # 狗叫的方法
    def bark(self):
        print('旺')
    def eat(self, something):
        print('狗吃' + something)
    def setName(self, name):
        self.name = name
    def getName(self):
        return self.name

dog1 = Dog()
dog1.bark()
dog1.eat('骨头')
dog1.setName('旺财')
print(dog1.getName())

5.7 __init__

__init__是Python自带的方法,需要至少一个参数self

__init__的作用是初始化,创建类的对象的时候,需要做的准备工作

(连接网络、打开文件、连接数据库)

当类的对象被创建的时候,该方法就会被调用

class Dog:
    # 初始化
    def __init__(self, name, age):
        self.name = name
        self.age = age

dog1 = Dog('旺财', 8)
print(dog1.name)
print(dog1.age)
dog2 = Dog('小花', 12)
print(dog2.name)
print(dog2.age)

5.8 __del__

删除对象的时候清理用的,调用者使用del关键字时候触发

class Dog:
    # 初始化
    def __init__(self, name, age):
        self.name = name
        self.age = age
    # 销毁
    def __del__(self):
        print('__del__')
        self.name = ''
        self.age = 0

dog1 = Dog('旺财', 8)
print(dog1.name)
print(dog1.age)
del dog1 # 主动触发 __del__
print('over') # 程序结束

5.9 封装

面向对象的三大特征:封装、继承、多态

属性的公有和私有

Python中描述私有属性和私有方法,通过前置下划线来表示

1 _xxx:单前置下划线

2 __xxx:双前置下划线

3 __xxx__:双前置双后置下划线。类的内部已经定义好了

描述私有,一般使用双前置下划线

class Dog:
    # 初始化
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    def getName(self):
        return self.__name
    # 返回对象本身的描述字符串
    def __str__(self):
        return 'name:%s, age:%s' % (self.__name, self.__name)

dog1 = Dog('旺财', 8)
#print(dog1.__name) # 在外部不能直接访问__name属性
print(dog1.getName())
print(dog1)

5.10 继承

子类继承父类

class 子类(父类):

子类的实现的代码

父类的所有的非私有属性和方法,子类中都会继承,并可以直接使用

# 父类
class Animal:
    def eat(self):
        print('Animal eat')

# 子类
class Dog(Animal):
    pass

dog1 = Dog()
dog1.eat()

子类可以重写父类的方法

# 父类
class Animal:
    def eat(self):
        print('Animal eat')

# 子类
class Dog(Animal):
    def eat(self):
        print('Dog eat')

dog1 = Dog()
dog1.eat()

还可以在子类方法中调用父类的方法

# 父类
class Animal:
    def eat(self):
        print('Animal eat')

# 子类
class Dog(Animal):
    def eat(self):
        super().eat() # 调用父类的eat()方法
        print('Dog eat')

dog1 = Dog()
dog1.eat()

子类还可以派生它的子类

# 子类的子类
class HabaDog(Dog):
    def eat(self):
        print('HabaDog eat')

dog2 = HabaDog()
dog2.eat()

Python中的约定:

如果一个类没有继承任何类,将默认继承object类

如下两种写法效果相同

# 父类
class Animal:
    def eat(self):
        print('Animal eat')
# 父类
class Animal(object):
    def eat(self):
        print('Animal eat')

在Python3中,建议使用后者

5.11 多态

不同事物,对同一个操作所表现出来的多种形态

外科医生、厨师、演员。Cut

动手术、切菜、下班

Python的多态比较简单(与Java比起来)

# 父类
class Animal(object):
    def eat(self):
        print('Animal eat')

class Dog(Animal):
    def eat(self):
        print('Dog eat')

class Man(Animal):
    def eat(self):
        print('Man eat')

class Woman(Animal):
    def eat(self):
        print('Woman eat')

# 函数
def doEat(obj):
    obj.eat()

dog1 = Dog()
man1 = Man()
woman1 = Woman()
doEat(dog1)
doEat(man1)
doEat(woman1)

doEat()函数中,理论上可以传递任意的参数。如果该参数的对象没有eat()方法,怎么办?

考虑使用 isinstance() 函数。判断是否为某个类的对象

print(isinstance(dog1, Dog)) # True
print(isinstance(dog1, Animal)) # True
print(isinstance(a1, Animal)) # True
print(isinstance(a1, Dog)) # False
print(isinstance('hello', Animal)) # False

可以在doEat()函数中,添加isinstance(),判断输入的obj是否为Animal的对象,只有是Animal对象时,才能调用eat()方法

# 函数
def doEat(obj):    
    # obj只有为Aniaml类或子类对象才有eat方法    
    # isinstance判断是否为某个类或子类的对象    
    # 参数1 obj 对象    
    # 参数2 type 类(类型)    
    if isinstance(obj, Animal):        
        obj.eat()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值