飞道的博客

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

266人阅读  评论(0)

长文预警  阅读约5分钟 

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

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

客户端浏览器一次http完整请求过程流程图(图文结合诠释请求过程)

网络基础HTTP协议进化篇

网络基础意淫篇

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

定义一个类


   
  1. # 定义一个普通类, 不进行继承
  2. class ClassName():
  3. statement
  4. # 定义一个继承于父类的类
  5. # 可以多个父类
  6. class ClassName(Parent1[,Parent2..]):
  7. statement
  8. # 定义一个新式类,继承自object
  9. class ClassName(object):
  10. statement
  11. # 使用 type函数定义类
  12. # parents是元组,继承的父类,第三个是字典,定义属性和方法
  13. ClassName= type( "ClassName",(parents),{ "property/method":value})

定义类属性和方法


   
  1. class ClassName():
  2. # 定义类内的属性
  3. prop1=value1
  4. # 初始化函数,在类初始化时可以传入参数.第一个必须是self 实例本身.
  5. __init__(self[,var1,var2...]):
  6. # 通过方法绑定属性,动态绑定
  7. self.prop1=var1
  8. self.prop2=var2
  9. statement
  10. # 一般的方法,对比一般函数,第一个总是self 实例本身
  11. method1(self[,var1...]):
  12. print self.prop1

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


   
  1. # __init__(self)
  2. obj=ClassName()
  3. # __init__(self,var1,var2)
  4. obj2=ClassName2(varA,varB)

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


   
  1. class Student(object):
  2. __init__(self,name,score):
  3. # can 't access directly
  4. self.__name=name
  5. # recommend not to access
  6. self._score=score
  7. get_name(self):
  8. return self.__name
  9. set_name(self,name):
  10. self.__name=name
  11. s=Student("John",59);
  12. s.__name="Mike"
  13. # -> AttributeError: 'Student ' object has no attribute '__name '
  14. s._Student__name="Mike"
  15. # OK!~

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

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

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


   
  1. # 定义父类, 继承于新式类object
  2. class Animal(object):
  3. def run(self): print "Animal is running"
  4. # 定义子类, 继承于父类
  5. class Dog(Animal):
  6. # 重载方法, 实现多态
  7. def run(self): print "Dog is running"
  8. a=Animal()
  9. d=Dog()
  10. # isinstance 判断可以判断出其是否源于某个父类.
  11. isinstance(d,Animal)
  12. # True
  13. isinstance(a,Dog)
  14. # False
  15. # 多态的好处在于有共同的某个方法,可以在传入后根据类的不同/特性来调用相应方法.
  16. def runTwice(animal):
  17. animal.run()

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

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


   
  1. # 定义主线父类, 继承于新式类object
  2. class Animal(object):
  3. def eat(self): print "Animal can eat"
  4. # 定义Mixin所用的 "功能"
  5. class Flyable(object):
  6. def fly(self): print "Animal can fly"
  7. class Runnable(object):
  8. def run(self): print "Animal can run"
  9. # 进行多重继承
  10. class Dog(Animal, Runnable): pass
  11. class Cat(Animal, Runnable): pass
  12. 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限定属性等), 元类的使用, 多重继承的一些问题.


   
  1. class C():pass
  2. class CC(object):pass
  3. c=C();
  4. cc=CC();
  5. type(C)
  6. # < type 'classobj'>
  7. type(CC)
  8. # < type 'type'>
  9. type(c)
  10. # < type 'instance'>
  11. type(cc)
  12. # <class '__main__.CC'>
  13. print C
  14. # __main__.C
  15. print CC
  16. # <class '__main__.CC'>
  17. print c
  18. # <__main__.C instance at 0x1096f4320>
  19. print cc
  20. # <__main__.CC object at 0x1096ed950>
  21. # Python 2.7 .10测试. 3.x测试结果可能不同.
  22. dir(c)
  23. # [ '__doc__', '__module__']
  24. dir(cc)
  25. # [ '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
  26. BB=CC
  27. bb=BB();
  28. print bb
  29. # <__main__.CC object at 0x1096eda10>

以上是经典的查看经典类和新型类(继承自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, 中文版数据模型

请继续关注我


转载:https://blog.csdn.net/qq_36772866/article/details/104035532
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场