专栏首页测试游记测试开发进阶(七)

测试开发进阶(七)

元类

新式类 旧式类

# 在python3中两个类定义没有任何区别,都是继承于object

# 在python2 中Myclass称为旧式类
class Myclass:
   pass

# 在python2 中Myclass1称为新式类
class Myclass1(object):
   pass
  • 在python2中
c = Myclass()
c1 = Myclass1()
print type(c)  # <type 'instance'>
print type(c1)  # <class '__main__.Myclass1'>
print type(Myclass)  # <type 'classobj'>
print type(Myclass1)  # <class 'type'>
  • 在python3中
c = Myclass()
c1 = Myclass1()
print(type(c))  # <class '__main__.Myclass'>
print(type(c1))  # <class '__main__.Myclass1'>
print(type(Myclass))  # <class 'type'>
print(type(Myclass1))  # <class 'type'>

使用type动态创建类

type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type

type(name, bases, dict)

  • name:类名
  • base:所继承的父类元祖
  • dict:字典(包含了属性和方法)

查看type的init方法

what也就是类名,必须要传入

def __init__(cls, what, bases=None, dict=None): # known special case of type.__init__
    """
    type(object_or_name, bases, dict)
    type(object) -> the object's type
    type(name, bases, dict) -> a new type
    # (copied from class doc)
    """
    pass

不传入bases和dict创建一个类

Myclass = type('Myclass')
print(Myclass)  # <class 'str'>
str1 = Myclass('124')
print(str1)  # 124
print(type(str1))  # <class 'str'>
print(type(Myclass))  # <class 'type'>

传入bases和dict创建一个类

def func(self):
    print(f'name:{self.name},age:{self.age}')


dict1 = {'name': 'zx', 'age': 18, 'func': func}
Myclass1 = type('Myclass1', (object,), dict1)
print(Myclass1)  # <class '__main__.Myclass1'>
print(type(Myclass1))  # <class 'type'>
m1 = Myclass1()
print(m1.name)  # zx
print(m1.age)  # 18
m1.func() # name:zx,age:18

对象引用

引用计数

a = 10 # a指向10,计数1
b = a # b引用a,a引用10,实际上b也引用10,计数2

引用计数减少

  • 对象的别名被显式销毁
  • 对象的一个别名被赋值给其他对象(a=10变为a=100,10的计数-1)
  • 对象从容器中移除,或容器销毁(对象从列表中移除,列表被销毁)
  • 一个引用离开了它的作用域(调用函数时,传入的参数,在函数结束的时候销毁)
import sys
print(sys.getrefcount(9999)) # 3
a = 9999
print(sys.getrefcount(9999)) # 4
b = a
print(sys.getrefcount(9999)) # 5

内置函数is和id

a = 10
b = 10
print(a is b)  # True
print(id(a), id(b))  # 4305020224 4305020224

li1 = [11, 22]
li2 = li1
li3 = [11, 22]
print(li1 is li2)  # True
print(li1 is li3)  # False
print(id(li1), id(li2), id(li3))  # 4326199176 4326199176 4326199240

深浅拷贝

  • 浅拷贝
li = [1, 2, 3]
li1 = li.copy()
li2 = li
# 4326199176 4326199240 4326199176
print(id(li), id(li1), id(li2))
li.append(33)
print(li, li1, li2)  # [1, 2, 3, 33] [1, 2, 3] [1, 2, 3, 33]

a = [1, 2]
li = [11, 22, a]
li1 = li.copy()
print(li, li1)  # [11, 22, [1, 2]] [11, 22, [1, 2]]
# 4348084936 4632599496
print(id(li), id(li1))  
a.append(3)
print(li, li1)  # [11, 22, [1, 2, 3]] [11, 22, [1, 2, 3]]
print(id(li), id(li1))  # 4354376392 4632599560
  • 深拷贝
li2 = copy.deepcopy(li)
# 4339696328 4632595208 4326199240
print(id(li), id(li1), id(li2))
# [11, 22, [1, 2, 3]] [11, 22, [1, 2, 3]] [11, 22, [1, 2, 3]]
print(li, li1, li2)
a.remove(3)
# 4339696328 4632595208 4326199240
print(id(li), id(li1), id(li2))
# [11, 22, [1, 2]] [11, 22, [1, 2]] [11, 22, [1, 2, 3]]
print(li, li1, li2)

本文分享自微信公众号 - 测试游记(zx94_11),作者:zx钟

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JSON必知必会阅读

    阅读了一下JSON必知必会,由于日常使用JSON比较多,所以文中内容大部分都已经接触过了,大概通读全书耗时1h左右 PDF地址:链接:https://pan.b...

    zx钟
  • Java自动化测试(数据库断言 18)

    数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。 所谓“数据库”是以一定方式储存在一起、能与...

    zx钟
  • Java自动化测试(allure 20)

    zx钟
  • 第四章:对象

    决定了该对象可以保存什么类型的值,可以进行什么样的操作,遵循什么样的规则。用内建函数type()查看。类型也是对象

    努力在北京混出人样
  • 浅谈python 中的 type(), dtype(), astype()的区别

    以上这篇浅谈python 中的 type(), dtype(), astype()的区别就是小编分享给大家的全部内容了,希望能给大家一个参考。

    砸漏
  • 分布式中Redis实现Session终结篇

      上一篇使用Redis实现Session共享方式虽然可行,但是实际操作起来却很麻烦,现有代码已经是这个样子了,总不可能全部换掉吧!好吧,这是个很实际的问题,那...

    用户1168362
  • ffuf:Go语言编写的高速Web Fuzzer

    ffuf是一款Go语言编写的高速Web Fuzzer工具,该项目深受大型项目gobuster和wfuzz的启发。

    FB客服
  • SQL Server 使用全文索引进行页面搜索

    概述 全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一...

    逸鹏
  • git小玩意儿之别名

    mwangblog
  • SQL Server 使用全文索引进行页面搜索

    全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类...

    逸鹏

扫码关注云+社区

领取腾讯云代金券