定义一个最基本的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