XZ_Python之Python3面向对象第一节

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


猜你喜欢

转载自blog.csdn.net/understand_xz/article/details/79868579