python第八章

一、面向对象补充

特殊的类属性:

对于任何类C,显示如下:

C.__name__           类C的名字(string)

C.__doc__             类C的文档字符串

C.__bases__          类C的所有父类构成元素(包含了以个由所有父类组成的元组)

C.__dict__             类C的属性(包含一个字典,由类的数据属性组成)

C.__module__        类C定义所在的模块(类C的全名是‘__main__.C‘,如果C位于一个导入模块mymod中,那么C.__module__ 等于 mymod)

C.__class__           实例C对应的类

实例:

如果类是一种数据结构定义类型,那么实例则声明了以个这种类型的变量。实例是有生命的类。  通过调用类对象来创建实例。

__init__() “构造器”方法(相当于构造函数),在类调用实例化的时候检查是否有__init__方法,如果有就调用它。__init__应当返回None

__new__() ....? 与楼上的有啥区别?

__del__() "解构器"方法,该函数要直到该实例对象所有的引用都被清除掉后才会执行。解构器只能被调用一次,一旦引用计数为0,则对象就被清除了

实例属性:设置实例的属性可以再实例创建后任意时间进行;内建函数dir()可以显示类属性,也可以显示实例属性。

特殊的实例属性,任意对象I

I.__class__                      实例化I的类

I.__dict__                       I的属性,内建类型不存在__dict__属性,内建类型:int  float complex....

类属性与实例属性

类属性通过 类名.属性名 来访问,也可以通过  实例名.属性名 来访问,但是类属性只能通过类来更新(不可变对象),如果给这个实例同一个属性赋值

这会在这个实例上面增加这个属性,不会影响类属性。

静态方法和类方法:

      staticmethod() 和  classmethod() 内建函数:

class TestStaticMethod:
    def foo():
        print ‘calling static method foo()‘
    foo = staticmethod(foo)

class TestClassMethod:
    def foo(cls):
        print ‘calling class method foo()‘
        print ‘foo() is part of class:‘,cls.__name__
    foo = classmethod(foo)

tsm = TestStaticMethod()
TestStaticMethod.foo()    # calling static method foo()
tsm.foo()                 #calling static method foo()

tcm = TestClassMethod()
TestClassMethod.foo()     #calling class method foo\n  foo() is part of class: TestClassMethod
tcm.foo()                 # 同上

使用函数修饰符:

除了上面的使用内建方法外,还可以使用函数修饰符如下:

class TestStaticMethod:
    @staticmethod
    def foo():
        print ‘calling static method foo()‘        

class TestClassMethod:
    @classmethod
    def foo(cls):
        print ‘calling class method foo()‘
        print ‘foo() is part of class:‘,cls.__name__

tsm = TestStaticMethod()
TestStaticMethod.foo()   # calling static method foo()
tsm.foo()    #calling static method foo()

tcm = TestClassMethod()
TestClassMethod.foo()     #calling class method foo\n  foo() is part of class: TestClassMethod
tcm.foo()    # 同上

子类和派生:

创建子类: 括号里面是父类,如果没有从任何祖先类派生,可以使用object作为父类的名字。

class SubClassName(ParentClass1[,ParentClass2,...]):

      ‘optional class documentation string‘

      class_suite

__bases__类属性:对于任何子类,它是以个包含其父类的集合的元组。没有父类的类,他们的__bases__属性为空。

在子类方法中调用父类同名方法:

class P(object):    #父类

    def foo(self):

    print ‘Hi, I am P-foo()‘

class C(P):         #子类,继承父类P

    def foo(self):

    P.foo(self)     #调用父类同名方法

    print ‘Hi, I am C-foo()‘ 

super()内建方法:super()不但能找到基类方法,而且还为我们传进self,如下:

class C(p):
    def foo(self):
        super(C,self).foo()   #调用C基类方法,自动查找C的基类
        print ‘Hi,I am C-foo()‘

从标准类型派生:

a.不可变类型的例子:

class RoundFloat(float):
     def __new__(cls,val):  #覆盖float中的__new__
          return float.__new__(cls,round(val,2))  #  也可以 return super(RoundFloat,cls).__new__(cls,round(val,2))

b. 可变类型的例子:

class SortedKeyDict(dict):
    def keys(self):
        return sorted(super(SortedKeyDict,self).keys())

c = SortedKeyDict({‘zheng-cai‘:67,‘hui-jun‘:68,‘xin-yi‘:2})
>>> c.keys()
[‘hui-jun‘, ‘xin-yi‘, ‘zheng-cai‘]
>>> print [key for key in c]
[‘zheng-cai‘, ‘xin-yi‘, ‘hui-jun‘]

多重继承:

python允许类继承多个基类,即多重继承。

经典类继承使用深度优先,新式类采用广度优先查找属性,新式类有一个__mor__属性,显示继承的查找顺序。

 类、实例和其他对象的内建函数

issubclass(sub,sup): 判断一个类是另一个类的子类或者子孙类,如果是就返回True,第二个参数可以使可能父类组成的元组,只要第一个参数是其中给定元组中任何一个候选类的子类时,就返回True。

isinstance(obj1,class1):判断一个对象是否是另一个给定类的实例.是就返回True。第二个参数应当是类。

hasattr()\getattr()\setattr()\delattr() ------ 系列函数可以在各种对象下工作,不限于类和实例。操作obj.attr时就相当于调用*attr(obj,‘attr‘)系列函数。

class myClass(object):
    def __init__(self):
        self.foo = 100

 myInst = myClass()
 hasattr(myInst,‘foo‘)
#True
 getattr(myInst,‘foo‘)         #100
setattr(myInst,‘bar‘,200)
getattr(myInst,‘bar‘)          #200
delattr(myInst,‘bar‘)
hasattr(myInst,‘bar‘)         #False

dir(): 作用在实例上时,显示实例变量,还有实例所在的类及所有它的基类中定义的方法和类属性;作用在类上时,则显示类以及它的所有基类的__dict__中的内容。作用在模块上时,则显示模块的__dict__的内容。不带参数时,则显示调用者的局部变量。

super(type[,obj]) 函数:帮助找出相应的父类,然后方便调用相关的属性;super(MyClass,self).__init__()。

var()函数:与dir()类似。

类,实例及其他对象的内建函数

issubclass(sub,sup)     如果类sub是类sup的子类,则返回True,反之为False
isinstance(obj1,obj2)  如果实例obj1是类obj2或者obj2子类的一个实例;或者obj1是obj2的类型,则返回True;反之为Fasle
hasattr(obj,attr)    如果obj有属性attr(用字符串给出),返回True,反之,返回False
getattr(obj,attr[,default])   获取obj的attr属性;与返回obj.attr类似;如果attr不是obj的属性,如果提供了默认值,则返回默认值;不然就会引发一个异常 
setattr(obj,attr,val)  设置obj的attr属性值为val,替换任何已纯在的属性值;不然就创建属性;类似obj.attr = val
delattr(obj,attr)   从obj中删除属性attr,类似于del obj.attr
 dir(obj= None)    返回obj的属性的一个列表;如果没有给定obj,dir()则显示局部名字空间中的属性,也就是locals().keys()
 super(type,obj=None)  返回一个表示父类类型的代理对象;如果没有传入obj,则返回的super对象是非绑定的,反之,如果是以个type,issubclass(obj,type)必为True;否者isinstance(obj,type)就必为True
 vars(obj=None)     返回obj的属性及其值的一个字典;如果没有给出obj,vars()显示局部名字空间字典,也就是locals()

时间: 2024-10-27 04:39:45

python第八章的相关文章

Python 第八章笔记

第八章总结 8.5. heapq - 堆队列算法 有8个算法 方法 heappush heappop heappushpop heapreplace heapify merge nlargest nsmallest 最小堆封装 # 最小堆封装 from heapq import * import pprint class MinHeap: def __init__(self, iterable): self._iteralbe = [] self._max = 1000 self.linearp

python第八章:多任务--小白博客

多线程threading 多线程特点: #线程的并发是利用cpu上下文的切换(是并发,不是并行)#多线程执行的顺序是无序的#多线程共享全局变量#线程是继承在进程里的,没有进程就没有线程#GIL全局解释器锁#只要在进行耗时的IO操作的时候,能释放GIL,所以只要在IO密集型的代码里,用多线程就很合适 # 无序的,并发的 def test1(n): time.sleep(1) print('task', n) for i in range(10): t = threading.Thread(targ

python学习的部分笔记

Python学习:终于开始了啊 Date: 2014.10.30 Python 第八章 if  expression : expr_true_suite 由三部分组成,关键字+表达式+表达式为真或非零时的代码块,注意要有冒号,后面语句需要进行缩进. 单个if语句可以通过布尔操作符 and , or, not实现多重条件判断或者是否定判断. 在if中,0 以及none,””等都是false类型. 如果一个复合语句(例如 if 子句, while 或 for 循环)的代码仅仅包含一行代码,那么它可以

python核心编程--第八章 8.15 练习

#!/usr/bin/python # -*- coding: utf-8 -*- # 8–2. 循环. 编写一个程序, 让用户输入三个数字: (f)rom, (t)o, 和 (i)ncrement . # 以 i为步长, 从 f 计数到 t , 包括 f 和 t . 例如, 如果输入的是 f == 2, # t == 26, i == 4 , 程序将输出 2, 6, 10, 14, 18, 22, 26. f = int(raw_input("Please input from: "

《Python核心编程》 第八章 条件和循环

8–1.条件语句. 请看下边的代码 # statement A if x > 0: # statement B pass elif x < 0: # statement C pass else: # statement D pass # statement E (a)如果 x< 0 , 上面哪个语句(A, B, C, D, E)将被执行 (b)如果 x== 0 , 上面哪个居于将被执行? (c)如果 x> 0 , 上面哪个语句将被执行? 答: a: A,C,E b: A,D,E c

python入到到实战--第八章

第八章 函数 定义函数 关键字def def get_name(): print("测试函数代码") 调用函数 get_name() 向函数传递信息------在函数的括号内添加需要传递的信息 实参和形参 在函数定义时,函数括号内的参数是形参: 在调用函数时,函数括号内的参数是实参: 传递参数----还可以使用列表和字典 位置实参:实参的顺序和形参的顺序相同---------顺序很重要,如果顺序错误,则实际结果会跟预期结果差别 关键字实参:每个实参由变量名和值组成: 位置实参: def

流畅的python学习笔记第八章:深拷贝,浅拷贝,可变参数

首先来看赋值,浅拷贝,深拷贝. 一赋值: a=['word',2,3] b=a print id(a),id(b) print [id(x) for x in a] print [id(x) for x in b] a[0]='hello' print a print b E:\python2.7.11\python.exe E:/py_prj/fluent_python/chapter8.py 24709080 24709080 [24410496, 21298404, 21298392] [

《Python 学习手册4th》 第八章 列表与字典

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点笔记”“本章习题” - 标题1,二级标题用- 标题2,笔记大纲标题.习题题目- 加粗,16px ''' 重点笔记 摘要 这两种类型几乎是Python所有脚本的主要工作组件. 列表(list): 一. 列表的特点: 任意对象的有序结合.通过偏移读取.属于可变序列的分类.对象引用数组. 字典(Dict)

Python之路【第十八章】:Web框架

Web框架本质 1.众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import socket def handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n".encode("ut