python

    科技2026-01-17  10

    list:[] 有序、可重复、可变 tuple:() 有序,可重复、初始化后不可变 dict:{key:value} 有序、不可重复、可变 set:([]) 无序、不可重复、可变

    import bs4 #网页解析,获取数据 import re #正则表达式 import urllib.request,urllib.error #指定URL,获取网页数据 import xlwt #进行excel操作 import sqlite3 #进行SQLite数据库操作 def main(): # 1.list # list = [1,1,1,2,2,3,4,5] # list.append(1) # 2.tuple # tuple = (1,2,3,4,2,1,1) # for i in tuple: # print(i) # 3.dict # dict = {'key':'value','key':'value2'} # dict["key2'] = "value2" # for item in dict: # print(item+":"+dict[item]) # 4.set set = ([1,1,2,2,2,3,3]) set.append(4) for i in set: print(i) if __name__ == '__main__': #当程序执行时 main()

    和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数、关键字参数和命名关键字参数。要定义一个方法,除了第一个参数是self外,其他和普通函数一样。要调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入 class Student(object): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print('%s: %s' % (self.name, self.score)) def get_grade(self): if self.score >= 90: return 'A' elif self.score >= 60: return 'B' else: return 'C'

    私有属性

    如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:

    class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print('%s: %s' % (self.__name, self.__score))

    改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了: 这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

    注意 需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。

    有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

    双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:

    bart._Student__name 'Bart Simpson'

    但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。

    总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。

    多态

    多态的好处就是,当我们需要传入Dog、Cat、Tortoise……时,我们只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思

    静态语言 vs 动态语言

    对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。

    对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了:

    class Timer(object): def run(self): print('Start...')

    这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

    Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个read()方法,返回其内容。但是,许多对象,只要有read()方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()方法的对象。

    type()

    来判断对象类型,使用type()函数

    isinstance()

    对于class的继承关系来说,使用type()就很不方便。我们要判断class的类型,可以使用isinstance()函数。

    isinstance(Dog, Animal) >True

    dir()

    获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list

    dir('ABC') >['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

    类似__xxx__的属性和方法在Python中都是有特殊用途的,比如__len__方法返回长度。在Python中,如果你调用len()函数试图获取一个对象的长度,实际上,在len()函数内部,它自动去调用该对象的__len__()方法,所以,下面的代码是等价的:

    len('ABC') >3 'ABC'.__len__() >3

    getattr()、setattr()以及hasattr()

    hasattr(obj, 'x') # 有属性'x'吗? >True obj.x >9 hasattr(obj, 'y') # 有属性'y'吗? >False setattr(obj, 'y', 19) # 设置一个属性'y' hasattr(obj, 'y') # 有属性'y'吗? >True getattr(obj, 'y') # 获取属性'y' >19 obj.y # 获取属性'y' >19

    一个正确的用法的例子如下:

    def readImage(fp): if hasattr(fp, 'read'): return readData(fp) return None

    假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。

    请注意,在Python这类动态语言中,根据鸭子类型,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。

    Processed: 0.013, SQL: 9