Python 面向对象进阶(二)

1. 垃圾回收

  • 小整数对象池

    • Python对小整数的定义是 [-5, 257),这些整数对象是提前建立好的;
    • 在一个Python程序中,所有位于这个范围内的整数,使用的都是同一个对象;
    • 单个字符共用对象,常驻内存;
  • 大整数对象池
    • 每一个大整数,均创建一个新的对象;
  • intern机制
    • 单个单词,不可修改,默认开启intern机制,共用对象,当引用计数为0时,则销毁;
    • 字符串(含有空格),不可修改,没有开启intern机制,不共用对象;
# 示例:
a1 = "Helloworld"
a2 = "HelloWorld"
a3 = "HelloWorld"
a4 = "HelloWorld"
a5 = "HelloWorld"
a6 = "HelloWorld"

# 说明:
# intern 机制,内存中只有一个"HelloWorld"所占的空间,靠引用计数去维护何时释放。

1.1 GC 垃圾回收

  • Python 采用的是引用计数机制为主,以分代收集机制为辅的策略;
  • gc 模块常用函数:
    • gc.get_threshold(): 获取gc模块中自动执行垃圾回收的频率;
    • gc.set_threshold(threshold[, threshold1[, threshold2]])设置自动执行垃圾回收的频率;
    • gc.get_count(): 获取当前自动执行垃圾回收的计数器,返回一个长度为3的列表;
    • gc.collect(): 显示执行垃圾回收;
# 示例:
# 引用计数缺点:循环引用
class ClassA():
    def __init__(self):
        print("object born,id:%s" % str(hex(id(self))))

def f2():
    while True():
        c1 = ClassA()
        c2 = ClassA()
        c1.t = c2
        c2.t = c1
        del c1
        del c2

f2()

2. 内建属性和内建函数

2.1 内建属性

  • 常用属性

    • __init__: 构造初始化函数;
    • __new__: 生成实例所需属性;
    • __class__: 实例所在的类, 实例.__class__
    • __str__: 实例字符串表示,可读性; print(类实例)
    • __repr__: 实例字符串表示,准确性; 类实例 回车时触发
    • __del__: del 实例时,触发;
    • __dict__: 实例自定义属性;
    • __doc__: 类文档,子类不继承; help(类或实例)
    • __getattribute__: 属性访问拦截器;
    • __bases__: 类的所有父类构成元素, 类名.__bases__
# 示例: 属性拦截器
class Test(object):
    def __init__(self, subject1):
        self.subject1 = subject1
        self.subject2 = 'cpp'

    # 属性访问拦截器,打印日志信息
    def __getattribute__(self, obj):
        print("===1>%s" % obj)
        if obj == 'subject1':
            print('log subject1')
            return 'redicrect python'
        else:
            temp = object.__getattribute__(self, obj)
            print("===2>%s" % str(temp))
            return temp

    def show(self):
        print("this is a Test")

s = Test("python")
print(s.subject1)
print(s.subject2)

s.show()
# 调用方法步骤:
# 1. 先使用属性访问拦截器,获取show属性对应的方法;
# 2. 方法()

# 示例二: 属性拦截器注意事项
class Person(object):
    def __getattribute__(self, obj):
        print("=== test ===")
        if obj.startswith("a"):
            return "haha"
        else:
            return self.test

    def test(self):
        print("heihei")

t = Person()

t.a     # 返回 haha

t.b     # 会让程序挂掉
# 原因: 当 t.b 执行时,会调用Person类中定义的 __getattribute__ 方法, if 条件不满足,所以程序
# 执行 else 里面的代码, 即 return self.test; 因为 return 需要 self.test 的值返回,那么首先
# 要先获取 self.test 的值, 因为 self 此时就是对象 t, 所以,self.test = t.test, t.test 此时
# 要获取t这个对象的 test 属性,那么,就会跳转到 __getattribute__ 方法去执行,即此时产生了递归调用;

2.2 内建函数

  • dir(__builtins__): 可以查看Python解释器启动后,默认加载的属性和函数;
# 示例一: range
range(stop)
range(start, stop[, step])

# 备注:
#   python2中 range 返回列表;
#   python3中 range 返回一个迭代值;如果想得到列表,可通过 list 函数
#  pyton3 创建列表的另外一种方法:
testList = [x*2 for x in range(10)]
testList

# 示例二: map 函数
# map 函数会根据提供的函数对指定序列做映射
# map(function, sequence[, sequence, ...]) -> list
#   function: 函数
#   sequence: 一个或多个序列,取决于function需要几个参数;
#   返回值是一个list

# 函数需要一个参数
map(lambda x: x*x, [1, 2, 3])   # 结果为: [1, 4, 9]

# 函数需要两个参数
map(lambda x, y: x+y, [1, 2, 3], [4, 5, 6])     # 结果为: [5, 7, 9]

# 示例三: filter 函数
# filter(function or None, sequence) -> list, tuple, or string
#   function: 接受一个参数,返回布尔值True或False
#   sequence: 序列可以是 str, tuple, list
#   filter 函数会对序列参数sequence中的每个元素调用function函数, 最后返回的结果包含调用结果为
#   True的元素

filter(lambda x: x%2, [1, 2, 3, 4])     # 结果为[1, 3]

# 示例四: reduce 函数
# reduce(function, sequence[, initial])  -> value
#   function: 该函数有两个参数
#   sequence: 序列可以是 str, tuple, list
#   initial: 固定初始值
#  reduce 函数依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。第一次调用
#  function时,如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function, 否则会以
#  序列sequence中的前两个元素做参数调用function。注意,function 函数不能为None

reduce(lambda x, y: x+y, [1, 2, 3, 4])  # 结果为: 10

reduce(lambda x, y: x+y, ['aa', 'bb', 'cc'], 'dd')      # 结果为: ddaabbcc

# 备注: Python3, reduce函数已经从全局名字空间中移除,现在被放置在functools模块里面,
# 如果需要使用,需要先导入: from functools import reduce

# 示例五: sorted 函数
# sorted(iterable, cmp=None, key=None, reverse=Fale) -> new sorted list

sroted(['dd','yy','ee','ss','ww'], reverse=1)

3. 集合 set

  • 集合与之前列表,元组类似,可以存储多个数据,但是这些数据是不重复的;
  • 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric_difference(对称差集)等数学运算;
# 示例:
a = "abcdef"
b = set(a)      # 输出: {'a', 'b', 'c', 'd', 'e', 'f'}
A = "bdfwm"
B = set(A)
b&B     # 取交集
b|B     # 取并集
b-B     # 取差集
b^B     # 对称差集(在b或B中,但不会同时出现在二者中)

4. functools

# Python3
import functools
dir(functools)      # 查看所有的工具函数

# 函数一: partial函数(偏函数)
# 把一个函数的某些参数设置默认值,返回一个新的函数,调用这个新函数会更简单

import functools

def showarg(*args, **kw):
    print(args)
    print(kw)

p1 = functools.partial(showarg, 1,2,3)
p1()    # 输出: (1, 2, 3) {}
p1(4, 5, 6)     # 输出: (1, 2, 3, 4, 5, 6)  {}
p1(a='python', b='java')    #输出: (1, 2, 3) {'b':'java', 'a':'python'}

# 函数二: wraps 函数
# 使用装饰器时,有一些细节需要被注意。例如,被装饰后的函数,其实已经是另外一个函数了(函数属性会发生改变)

def note(func):
    '''note function'''     # 说明文档
    def wrapper():
        '''wrapper function'''
        print('note something')
        return func()
    return wrapper

@note
def test():
    '''test function'''
    print('I am test')

print(help(test))
# 输出wrapper的说明文档
# wrapper()
#    wrapper function

# functools 包提供了 wraps 装饰器来消除这样的副作用
import functools
def note(func):
    '''note function'''
    @functools.wraps(func)
    def wrapper():
        '''wrapper function'''
        print('note something')
        return func()
    return wrapper

@note
def test():
    '''test function'''
    print('I am test')

print(help(test))
# 输出:
#   test()
#       test function

参考资料:

原文地址:https://www.cnblogs.com/linkworld/p/8543779.html

时间: 2024-08-04 08:04:02

Python 面向对象进阶(二)的相关文章

Python面向对象进阶和socket网络编程-day08

写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self,name): self.name=name p = Chinese('standby') # 实例化一个对象 print(p) # 打印这个对象 --- <__main__.Chinese object at 0x0000000000B3A978> - 示例2: >&g

Python爬虫进阶二之PySpider框架安装配置

关于 首先,在此附上项目的地址,以及官方文档 PySpider 官方文档 安装 1. pip 首先确保你已经安装了pip,若没有安装,请参照 pip安装 2. phantomjs PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速.原生支持各种Web标准:DOM 处理.CSS 选择器.JSON.Canvas 和 SVG. PhantomJS 可以用于页面自动化.网络监测.网页截屏以及无界面测试等. 安装 以上附有官方安

python yield 进阶(二)

PS:接上一篇 本文摘自OSchina Linuxqueen 不幸的是,这样做看上去似乎不太可能.即使是我们有神奇的函数,可以让我们从n遍历到无限大,我们也会在返回第一个值之后卡住: 1 def get_primes(start): 2     for element in magical_infinite_range(start): 3         if is_prime(element): 4             return element 假设这样去调用get_primes: 1

python面向对象进阶版

面向对象基础知识: 1.面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 2.类是一个模板,模板中包装了多个'函数'供使用(可以将多函数中公用的变量封装到对象中): 3.对象,根据模板创建的实例(即:对象),实例用于被包装在类中的函数: 4.面向对象三大特性:封装.继承和多态. 面向对象进阶篇详细介绍python类的成员.成员修饰符和类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存

python面向对象进阶

isinstance(obj,cls)检查是否obj是否是类 cls 的对象. isinstance(obj,cls)检查是否obj是否是类 cls 的对象. 反射 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数(参数是对象,字符串格式的属性名) hasattr getattr setattr delattr __del__,就是析构方法,当对象在内存中被释放时,自动触发执行. 注:此方法一般无须定义,

python面向对象进阶(八)

上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象

python 面向对象 进阶篇

在上篇<python面向对象>中,简单介绍了python中面向对象的基本知识 在这篇博客中,详细介绍python类的成员,成员修饰符,类的特殊成员. 类的成员 类的成员分为三种:字段,方法和属性 所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 字段 字段包括普通字段和静态字段.静态字段,保存在类中.普通字段,保存在对象中. class FOO: country = “中国

Python 面向对象特性二 多态(3-7)

接口类: 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能 在Python中是没有接口的概念的(接口是在Java里的) from abc import ABCMeta,abstractmethod#调用abc模块中的抽象方法 # 接口类 : 接口类就是一个规范 接口类一般是项目设计人员写好的 class Pa

Python 面向对象进阶

1 isinstance 和issubclass instance:判断该对象是否是类的对象 isinstance(obj,Foo) x = [] print(isinstance(x,list)) 结果:True issubclass:判断是否是继承 class Foo: pass class Bar(Foo): pass print(issubclass(Bar,Foo)) 结果:True 通过下面的方式也可以查看print(Bar.base) 2 反射 反射是Smi首次提出的,主要指程序可