XZ

xiaoxiao2021-02-28  49

定义一个最基本的class

如果是一个空的class或者是自己新写的class,它可以继承object最基本的class定义:

class test(object): a = 8 def func(self): return "好的" # 调用 t = test() # t 是类 test 的一个实例 print(t.a) # a被称为 test 的属性 print(t.func()) # func 被称为 test的方法

class最基本的子元素

class 又称为函数的集合,因为class最基本的子元素就像一个又一个的函数,只是比函数多了一个self参数

class test(object): def get(self): return "哈哈" pass t = test() print(t.get()) # 调用 # 函数 get def get(): return "哈哈" print(get()) # 调用 函数 get

如何去使用对象内置的方法?    1、实例化这个class (test)t = test()

    2、使用 class.method()的方法去调用 class 的内置方法

test类的get方法被称之为test对象的方法,属于 test 对象本身,不能被外界调用

函数get是可以直接被调用的,而不需要先创建对象,再调用方法。

注意:当定义一个 class 的内置方法method时,method的第一个参数永远是self,self是默认的参数

class传参

class test(object): def get(self,a): return a pass t = test() print(t.get(4)) # 调用

get方法后面可以再添加参数,在调用的时候将参数传入即可。

构造、析构函数

构造函数 __init__,在创建对象的时候传入值

class test(object): a = 8 def func(self): return self.arg1, self.arg2 def __init__(self,arg1,arg2): self.arg1 = arg1 self.arg2 = arg2      # 调用 t = test(5,6) # 给 init 方法传参,在初始化之后,改变对象的某些值 print(t.a) print(t.func())

析构函数 __del__,函数的销毁

def __del__(self): del self.arg1 del self.arg2

    在class销毁的时候,class内部的东西会被销毁,一般情况下不需要做这些操作,在有些类启动的时候会有些开销,这些开销会超出内存,在类销毁的时候做一些清除

class和函数的区别

普通的函数中,不能把上一个函数定义的变量在下一个函数中直接使用,而class可以。

在函数中,每个函数都有自己的作用域,一个函数中定义的变量是不可以在另一个函数中使用的,除非用global定义为全局变量。

而在class中,我们可以使用self,当我们对self的变量进行赋值的时候,我们可以在另一个函数中直接使用,这是self的非常大的好处。

class test(object): def __init__(self,var1): self.var1 = var1 def get(self,a=None): return self.var1 t = test("测试一下") print(t.get()) #输出结果:测试一下

下面附一些自己练习实现的小方法:

1、查找任意磁盘路径下的文件夹列表,没有则返回“Not dir”

import os def get_dir(f): if not os.path.isdir(f): return "输入的磁盘路径不正确" list_dir = [] for i in os.listdir(f): list_dir.append(i) if list_dir: return list_dir else: return "Not dir"

2、返回任意链接的网页内容

import urllib import logging def get_content(url): if not isinstance(url,str): return "输入的网址类型不对" if not url.startswith('http://') and not url.startswith('https://'): return "error url_format" try: url_info = urlopen(url).read() except Exception as e: logging.debug(e) else: return url_info

3、func(url,folder_path)获取url地址的内容,保存到folder_path的文件目录下,并随机生成一个文件名

import urllib from urllib import request import random import os def save_url_content(url, folder_path=None): if not url.startswith("http://") and not url.startswith("https://"): return u'url地址不符合规则' if not os.path.isdir(folder_path): return u'folder_path非文件夹' d = urllib.request.urlopen(url) content = d.read() rand_filename = 'test_%s'%random.randint(1,1000) file_path = os.path.join(folder_path,rand_filename) d = open(file_path,'w') d.write(str(content)) d.close() return file_path print(save_url_content("http://www.baidu.com",'/Users/admin/Desktop/修改IP'))

4、定义一个func(url),分析该url内容里有多少个链接

def get_url_count(url): if not url.startswith("http://") and not url.startswith("https://"): return u'url地址不符合规则' d = urllib.request.urlopen(url) content = d.read() href = content.split('<a href='.encode()) return len(href) - 1 print(get_url_count("http://www.baidu.com"))

5、定义一个func(folder_path),合并该目录下所有文件,生成一个text.txt

# 使用递归实现 def merge(folder_path): for file in os.listdir(folder_path): file_path = os.path.join(folder_path,file) if os.path.isdir(file_path): # 是文件夹 merge(file_path) # 递归 else: # 不是文件夹,打开文件写入到text.txt中 merge_file = open('/Users/admin/Desktop/修改IP/text.txt','ab+') content = open(file_path,'r').read() merge_file.write(content.encode()) merge_file.close() merge("/Users/admin/Desktop/修改IP/获取网页数据")

6、定义一个func(url),获取他?后的参数,并返回一个dict

from urllib.parse import urlparse def querys(url): qy = urlparse(url).query item = urllib.parse.parse_qs(qy).items() return dict([(k,v[0]) for k,v in item]) print(querys("http://123.com")) # {} print(querys("http://api/bsi?g=6&m=8")) # {'g': '6', 'm': '8'} print(querys("http://api/info?in=56")) # {'in': '56'}7、定义一个func(folder),删除该folder下的所有文件 #使用递归实现 def delelte(dir_path): for path in os.listdir(dir_path): file_path = os.path.join(dir_path,path) if os.path.isdir(file_path): delelte(file_path) else: os.remove(file_path) delelte("/Users/admin/Desktop/修改IP/获取网页数据")

下面是遇到的一些问题以及解决:

很多问题都是因为Python2.0和Python3.0的不同导致的

1、AttributeError: module 'urllib' has no attribute 'urlopen'

解决:首先引入相关的类request,urlopen方法在Python3.0以后是在request类中的,

from urllib import request d = urllib.request.urlopen(url)

2、TypeError: a bytes-like object is required, not 'str'

解决:将str使用encode方法进行编码为指定的bytes

参考文章:https://blog.csdn.net/yexiaohhjk/article/details/68066843

href = content.split('<a href='.encode())

3、NameError:name 'parse_qs' is not defined

在python 3中 urlparse模块被集成到了urllib中

import urlparse 修改成 from urllib.parse import urlparse

转载请注明原文地址: https://www.6miu.com/read-2623264.html

最新回复(0)