python面对对象爬虫_爬虫 (三十) python 类和对象object (二十一)

长文预警 阅读约5分钟

相信如果你慢慢把这篇文章读完,然后合并实践,你重组python函数会有很大的理解,加油看完哦

经过上述三节,穿插讲了一下HTTP的知识点,以及浏览器的界面资源的获取,以及运行过程,我们可以收获到很多东西,如果没有好好看的伙伴可以趁热打铁

类的一般知识Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。用类作为抽象”模板”, 而创建机体的一个对象, 称之为实例(Instance).用来储存对象属性数据的称为属性, 而调用来进行针对对象的处理的关联函数,称之为方法.

定义一个类

# 定义一个普通类, 不进行继承

class ClassName():

statement

# 定义一个继承于父类的类

# 可以多个父类

class ClassName(Parent1[,Parent2..]):

statement

# 定义一个新式类,继承自object

class ClassName(object):

statement

# 使用type函数定义类

# parents是元组,继承的父类,第三个是字典,定义属性和方法

ClassName=type("ClassName",(parents),{"property/method":value})

定义类属性和方法

class ClassName():

# 定义类内的属性

prop1=value1

# 初始化函数,在类初始化时可以传入参数.第一个必须是self 实例本身.

__init__(self[,var1,var2...]):

# 通过方法绑定属性,动态绑定

self.prop1=var1

self.prop2=var2

statement

# 一般的方法,对比一般函数,第一个总是self 实例本身

method1(self[,var1...]):

print self.prop1

创建实例创建实例就是类名(参数),参数取决于init方法.

# __init__(self)

obj=ClassName()

# __init__(self,var1,var2)

obj2=ClassName2(varA,varB)

访问限制python没有真正的办法限制用户访问对象的属性/方法, 只能靠自觉了.以开头的变量(var特殊变量除外) 不能直接用名字访问; 以开头的变量暗示不要去访问,但不限制直接访问. 以开头的变量其实可以用className__var来访问.

class Student(object):

__init__(self,name,score):

# can't access directly

self.__name=name

# recommend not to access

self._score=score

get_name(self):

return self.__name

set_name(self,name):

self.__name=name

s=Student("John",59);

s.__name="Mike"

# -> AttributeError: 'Student' object has no attribute '__name'

s._Student__name="Mike"

# OK!~

继承和多态python的继承和多态比C++要简单太多..继承就是从父类继承一切, 多态就是重置一些父类也有的属性/方法,使其实现子类的特殊性.

继承的好处在于可以减少重用代码, 实现更抽象,也是多态的基础.

多态的好处在于有共同的某个方法,可以在传入后根据类的不同/特性来调用相应方法.

# 定义父类, 继承于新式类object

class Animal(object):

def run(self): print "Animal is running"

# 定义子类, 继承于父类

class Dog(Animal):

# 重载方法, 实现多态

def run(self): print "Dog is running"

a=Animal()

d=Dog()

# isinstance 判断可以判断出其是否源于某个父类.

isinstance(d,Animal)

# True

isinstance(a,Dog)

# False

# 多态的好处在于有共同的某个方法,可以在传入后根据类的不同/特性来调用相应方法.

def runTwice(animal):

animal.run()

Python还可以进行多重继承(指定多个父类), 通过多重继承来获得附属的新属性和功能, 这种设计又叫Mixin设计, 在C++/Java中均没有的功能.

多重继承时, 若多个父类中有相同的方法, 则排在前的父类将覆盖后面的,则越靠前越”主类”. 即使主类的方法源自父类的父类, 也依然优先.

# 定义主线父类, 继承于新式类object

class Animal(object):

def eat(self): print "Animal can eat"

# 定义Mixin所用的"功能"类

class Flyable(object):

def fly(self): print "Animal can fly"

class Runnable(object):

def run(self): print "Animal can run"

# 进行多重继承

class Dog(Animal, Runnable): pass

class Cat(Animal, Runnable): pass

class Bird(Animal, Flyable): pass

新式类(object类)和传统类Python2.1前,旧式类是唯一可用的类型, 在2.2中引入了新式类, 为了统一class和type的概念.

旧式类中的实例x, x.class对应的是其类,但type(x)永远都是. 在新式类中, 一般情况下x.class和type(x)都是统一的(因为私自可以改class).

旧式类的类型是, 而新式类的类型则是, 表面旧式类是源自于classobj,其实例源自于instance. 而新式类的则源于type, 并且其实例源自于对应的类. 引入新式类是为了使用元类来构造类对象, 统一类的模型. 一般新式类顶级的类是object,一般新式类均源于他. Python 3.x 全是新式类, 不需再继承object了.

新式类的使用有很多好处: 可以继承大部分内建类型, 引入了计算属性功能的descriptor(装饰器或者叫描述符, 如@property等), 使用各种特殊方法(如str,低级别的构造函数new,slots限定属性等), 元类的使用, 多重继承的一些问题.

class C():pass

class CC(object):pass

c=C();

cc=CC();

type(C)

#

type(CC)

#

type(c)

#

type(cc)

#

print C

# __main__.C

print CC

#

print c

# <__main__.c instance at>

print cc

# <__main__.cc object at>

# Python 2.7.10测试. 3.x测试结果可能不同.

dir(c)

# ['__doc__', '__module__']

dir(cc)

# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

BB=CC

bb=BB();

print bb

# <__main__.cc object at>

以上是经典的查看经典类和新型类(继承自object)信息的代码. 经典类的类叫 classobj, 而新式类的类叫 type. 经典类对象的类是熟知的instance, 而新式类的对象的类则是创建该类的类对象main.CC. 打印出来的效果也是,新式类才是真的类,其对象也才是真的object对象.

新式类本事其实也是一个对象, 可以用变量接收, 可以作为函数参数传递甚至返回, 可以拷贝, 可以添加新属性, 可以创造对象(类的特性). 例如上述例子用BB接收类,用BB同样可以创造CC类的对象.

元类元类就是类的类,用于创建各种类,一般类的元类是type类. 可以利用type方法来创建新式类(和class关键词效果相当).

细节请参考另一篇Python:元类metaclass.

类属性特殊处理 类的特殊属性/方法 请参考另一篇Python对象的特殊属性和方法.

属性slots: 一个元组, 规定了可以设置的属性. 防止动态加载过多的属性. 方法new: 构造函数, 创造类实例时的函数, 一般不修改. 类/对象的相关函数 type(obj): 获取对象的相应类型. type(className, (parents), {attr:value}): 创建并返回一个类, 三个参数对于类名(字符串),父类(放在元组内)以及属性(属性/方法名以及对应值) isinstance(obj, type): 判断对象是否和指定的type类型相等(type甚至可以是父类). hasattr(obj, attr): 判断对象是否具有指定属性/方法 getattr(obj, attr[, default]): 获取属性/方法的值, 如设置default,要是没有该属性则返回缺失值(否则AttributeError). 类似于obj.attr setattr(obj,attr,value): 设定该属性/方法的值. 类似于obj.attr=value dir(obj): 获取相应对象的所有属性和方法名(字符串)的列表.ReferencePython对象的特殊属性和方法 Python Datamodel, 中文版数据模型

请继续关注我

你可能感兴趣的:(python面对对象爬虫)