导航:首页 > 编程语言 > python3新式类

python3新式类

发布时间:2023-04-23 00:51:07

python新式类和经典类的区别

新式类对象可以直接通过__class__属性获取自身类型:type

[python] view plain
# -*- coding:utf-8 -*-

class E:
#经典类
pass

class E1(object):
#新式类
pass

e = E()
print "经典类"
print e
print type(e)
print e.__class__

print "新式类"
e1 = E1()
print e1
print e1.__class__
print type(e1)
[python] view plain
经典类
<__main__.E instance at 0x0000000002250B08>
<type 'instance'>
__main__.E

新式类
<__main__.E1 object at 0x0000000002248710>
<class '__main__.E1'>
<class '__main__.E1'>

我使用的是python 2.7。

E1是定义的新式类。那么输输出e1的时候,不论是type(e1),还是e1.__class__都是输出的<class '__main__.E1'>卜塌租。

2. 继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再型兆返回,开始找右侧;新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动

[python] view plain
# -*- coding:utf-8 -*-
class A(object):
"""
新式类
作为所有类的基类
"""
def foo(self):
print "class A"

class A1():
"衫弊""
经典类
作为所有类的基类
"""
def foo(self):
print "class A1"

class C(A):
pass

class C1(A1):
pass

class D(A):
def foo(self):
print "class D"

class D1(A1):
def foo(self):
print "class D1"

class E(C, D):
pass

class E1(C1, D1):
pass

e = E()
e.foo()

e1 = E1()
e1.foo()

输出

[python] view plain
class D
class A1

因为A新式类,对于继承A类都是新式类,首先要查找类E中是否有foo(),如果没有则按顺序查找C->D->A。它是一种广度优先查找方式。

因为A1经典类,对于继承A1类都是经典类,首先要查找类E1中是否有foo(),如果没有则按顺序查找C1->A1->D1。它是一种深度优先查找方式。

3. 新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中。

比如只允许对A实例添加name和age属性:

[python] view plain
# -*- coding:utf-8 -*-

class A(object):
__slots__ = ('name', 'age')

class A1():
__slots__ = ('name', 'age')

a1 = A1()
a = A()

a1.name1 = "a1"
a.name1 = "a"

A是新式类添加了__slots__ 属性,所以只允许添加 name age

A1经典类__slots__ 属性没用,

[python] view plain
Traceback (most recent call last):
File "t.py", line 13, in <mole>
a.name1 = "a"
AttributeError: 'A' object has no attribute 'name1'

所以a.name是会出错的

通常每一个实例都会有一个__dict__属性,用来记录实例中所有的属性和方法,也是通过这个字典,可以让实例绑定任意的属性

而__slots__属性作用就是,当类C有比较少的变量,而且拥有__slots__属性时,

类C的实例 就没有__dict__属性,而是把变量的值存在一个固定的地方。如果试图访问一个__slots__中没有

的属性,实例就会报错。这样操作有什么好处呢?__slots__属性虽然令实例失去了绑定任意属性的便利,

但是因为每一个实例没有__dict__属性,却能有效节省每一个实例的内存消耗,有利于生成小而精

干的实例。

4. 新式类增加了__getattribute__方法

[python] view plain
class A(object):
def __getattribute__(self, *args, **kwargs):
print "A.__getattribute__"

class A1():
def __getattribute__(self, *args, **kwargs):
print "A1.__getattribute__"

a1 = A1()
a = A()

a.test
print "========="
a1.test
[python] view plain
A.__getattribute__
=========
Traceback (most recent call last):
File "t.py", line 18, in <mole>
a1.test
AttributeError: A1 instance has no attribute 'test'

可以看出A是新式类,每次通过实例访问属性,都会经过__getattribute__函数,

A1不会调用__getattribute__所以出错了

Python 2.x中默认都是经典类,只有显式继承了object才是新式类

Python 3.x中默认都是新式类,不必显式的继承object

② 如何理解Python老式类和新式类

Python中类分两种:旧式类和新式类:

➤新式类都从object继承,经典类不需要。氏没
➤新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而歼谈纳旧式类的MRO算法是采用深度优先搜索
➤新式类相同父类只执行一次构造函数,经典类重复执行多次。

其中:
➤截止到python2.1,只存在旧式类。旧式类中,类名和type是无关的:如果x是一个旧式类,那么x.__class__定义了x的类名,但是type(x)总是返回<type 'instance'>。这反映了所有的旧式类的实例是通过一个单一的叫做instance的内建类型来实现的,这是它和类不同的地方。
➤新式类是在python2.2为了统一类和实例引入的。一个新式类只能由用户自定义。如果x是一个新式类的实例,那么type(x)和x.__class__是一样的结果(尽管这不能得到保证侍高,因为新式类的实例的__class__方法是允许被用户覆盖的)。
➤Python 2.x中默认都是经典类,只有显式继承了object才是新式类

➤python 3.x中默认都是新式类,经典类被移除,不必显式的继承object
Python2.x中:

[python] view plain print?
class A:
pass
class B:
pass
class C(B):
pass
class D(C,A):
pass
执行顺序为:D->C->B,->A

[python] view plain print?
class A(object):
pass
class B(object):
pass
class C(object):
pass
class D(A,B,C):
pass
执行顺序为: D->A->B->C->Object

③ python3和2的区别有什么

python2版本和python3版本的区别,两者对比如下

Python3 对 Unicode 字符的原生支持。

Python2 中使用 ASCII 码作为默认编码方式导致 string 有两种类型 str 和 unicode,Python3 只

支持 unicode 的 string。Python2 和 Python3 字节和字符对应关系为:

Python3 采用的是绝对路径的方式进行 import

推荐:Python教程

Python2 中相对路径的 import 会导致标准库导入变得困难(想象一下,同一目录下有 file.py,如

何同时导入这个文件和标准库 file)。Python3 中这一点将被修改,如果还需要导入同一目录的文件必

须使用绝对路径,否则只能使用相关导入的方式来进行导入。

Python2 中存在老式类和新式类的区别,Python3 统一采用新式类。新式蠢余携类声明要求继承 object,

必须用新式类应用多重继承。

Python3 使用更加严格的缩进。Python2 的缩进机制中,1 个 tab 和 8 个 space 是等价的,所

以在缩进中可以同时允许 tab 和 space 在代码中共存。这种等价机制会导致部分 IDE 使用存在问题。

Python3 中 1 个 tab 只能找另外一个 tab 替代,因此 tab 和 space 共存会导致报错:TabError:

inconsistent use of tabs and spaces in indentation.

废弃类差异

1. print 语句被 Python3 废弃,统一使用 print 函数

2. exec 语句被 python3 废弃,统一使用 exec 函数

3. execfile 语句被 Python3 废弃,推荐使用 exec(open("./filename").read())

4. 不相等操作符"<>"被 Python3 废弃,统一使用"!="

5. long 整数类型被 Python3 废弃,毁态统一使用 int

6. xrange 函数被 Python3 废弃,统一使用 range,Python3 中 range 的机制也进行修改并提高

了大数据集生成效率

7. Python3 中这些方法再不再返回 list 对象:dictionary 关联的 keys()、values()、items(),zip(),

map(),filter(),但是可以通过 list 强行转换带伏:

1. mydict={"a":1,"b":2,"c":3}

2. mydict.keys() #<built-in method keys of dict object at 0x000000000040B4C8>

3. list(mydict.keys()) #['a', 'c', 'b']

8. 迭代器 iterator 的 next()函数被 Python3 废弃,统一使用 next(iterator)

9. raw_input 函数被 Python3 废弃,统一使用 input 函数

10. 字典变量的 has_key 函数被 Python 废弃,统一使用 in 关键词

11. file 函数被 Python3 废弃,统一使用 open 来处理文件,可以通过 io.IOBase 检查文件类型

12. apply 函数被 Python3 废弃

13. 异常 StandardError 被 Python3 废弃,统一使用 Exception

更多技术请关注Python视频教程。

④ Python新式类和经典类的区别

A.在Python里凡是继承了object的类,都是新式类
B.Python3里只有新式类
C.Python2里面继承object的是新式类,没有写父类的是经典类
D.经典类目前在Python里基本没有应用
E.保持class与type的统一对新式类的实例执行a.class与type(a)的结果是一致的,对于旧式类来说就不一样了
F.对于多重继承的属性搜索顺序不一样新式类是采用广度优先搜索,旧式类采用深度优先搜索

⑤ python3--内置函数

python的常用内置函数

1.abs() 函数返回数字的绝对值

abs(-40)=40

2. dict() 函数用于创建一个字典

>>dict()

>>{}      #创建一个空字典类似于u={},字典的存取方式一般为key->value

例如u = {"username":"tom",  "age":18}

3. help() 函数用于查看函数或模块用途的详细说明

>>help('math')查看math模块的用处

>>a=[1,2,3,4]

>>help(a)查看列表list帮助信息

4.dir()获得当前模块的属性列表

>> dir(help)

['__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__mole__', '__ne__', '__new__', '__rece__', '__rece_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

>>>

5.min() 方法返回给定参数的最小值 /参数可以为序列

>>> a=  min(10,20,30,40)

>>> a

10

6. next() 返回迭代器的下一个项目

>>> it = iter([1, 2, 3, 4, 5])

>>> next(it)

1

>>>

>>> next(it)

2

>>>

7. id() 函数用于获取对象的内存地址

>>> a=12

>>> id(a)

1550569552

8.enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

>>> a=["tom","marry","leblan"]

>>> list(enumerate(a))

[(0, 'tom'), (1, 'marry'), (2, 'leblan')]

>>>

9. oct() 函数将一个整数转换成8进制字符串

>>> oct(15)

'0o17'

>>> oct(10)

'0o12'

>>>

10. bin() 返回一个整数 int 或者长整数 long int 的二进制表示

>>> bin(10)

'0b1010'

>>> bin(15)

'0b1111'

>>>

11.eval() 函数用来执行一个字符串表达式,并返回表达式的值

>>> eval('2+2')

4

12.int() 函数用于将一个字符串会数字转换为整型

>>> int(3)

3

>>> int(3.6)

3

>>> int(3.9)

3

>>> int(4.0)

4

>>>

13.open() 函数用于打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写

>>>f=open('test.txt')

14.str() 函数将对象转化为适于人阅读的形式

>>> str(3)

'3'

>>>

15. bool() 函数用于将给定参数转换为布尔类型,如果没有参数,返回 False

>>> bool()

False

>>> bool(1)

True

>>> bool(10)

True

>>> bool(10.0)

True

16.isinstance() 函数来判断一个对象是否是一个已知的类型

>>> a=5

>>> isinstance(a,int)

True

>>> isinstance(a,str)

False

>>>

17. sum() 方法对系列进行求和计算

>>> sum([1,2,3],5)

11

>>> sum([1,2,3])

6

>>>

18. super() 函数用于调用下一个父类(超类)并返回该父类实例的方法。super 是用来解决多重继承问题的,直接用类名调用父类方法

class   User(object):

      def__init__(self):

class Persons(User):

            super(Persons,self).__init__()

19. float() 函数用于将整数和字符串转换成浮点数

>>> float(1)

1.0

>>> float(10)

10.0

>>>

20. iter() 函数用来生成迭代器

>>> a=[1,2,3,4,5,6]

>>> iter(a)

>>> for i in iter(a):

...         print(i)

...

1

2

3

4

5

6

>>>

21.tuple 函数将列表转换为元组

>>> a=[1,2,3,4,5,6]

>>> tuple(a)

(1, 2, 3, 4, 5, 6)

>>>

22.len() 方法返回对象(字符、列表、元组等)长度或项目个数

>>> s = "playbasketball"

>>> len(s)

14

>>>a=[1,2,3,4,5,6]

>>> len(a)

6

>>>

23. property() 函数的作用是在新式类中返回属性值

class User(object):

     def __init__(self,name):

              self.name = name

    def get_name(self):

              return self.get_name

    @property

     def name(self):

             return self_name

24.type() 函数返回对象的类型

25.list() 方法用于将元组转换为列表

>>> b=(1,2,3,4,5,6)

>>> list(b)

[1, 2, 3, 4, 5, 6]

>>>

26.range() 函数可创建一个整数列表,一般用在 for 循环中

>>> range(10)

range(0, 10)

>>> range(10,20)

range(10, 20)

>>>

27. getattr() 函数用于返回一个对象属性值

>>> class w(object):

...             s=5

...

>>> a = w()

>>> getattr(a,'s')

5

>>>

28. complex() 函数用于创建一个复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数

>>> complex(1,2)

(1+2j)

>>> complex(1)

(1+0j)

>>> complex("1")

(1+0j)

>>>

29.max() 方法返回给定参数的最大值,参数可以为序列

>>> b=(1,2,3,4,5,6)

>>> max(b)

6

>>>

30. round() 方法返回浮点数x的四舍五入值

>>> round(10.56)

11

>>> round(10.45)

10

>>> round(10.45,1)

10.4

>>> round(10.56,1)

10.6

>>> round(10.565,2)

10.56

>>>

31. delattr 函数用于删除属性

>>> class Num(object):

...    a=1

...    b=2

...    c=3.

..>>> print1 = Num()

>>> print('a=',print1.a)

a= 1

>>> print('b=',print1.b)

b= 2

>>> print('c=',print1.c)

c= 3

>>> delattr(Num,'b')

>>> print('b=',print1.b)

Traceback (most recent call last):  File "", line 1, inAttributeError: 'Num' object has no attribute 'b'

>>>

32. hash() 用于获取取一个对象(字符串或者数值等)的哈希值

>>> hash(2)

2

>>> hash("tom")

-1675102375494872622

33. set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

>>> a= set("tom")

>>> b = set("marrt")

>>> a,b

({'t', 'm', 'o'}, {'m', 't', 'a', 'r'})

>>> a&b#交集

{'t', 'm'}

>>> a|b#并集

{'t', 'm', 'r', 'o', 'a'}

>>> a-b#差集

{'o'}

>>>

⑥ python3和python2的区别

> 1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc')
但是 python2.6+ 可以使用 from __future__ import print_function 来实现相同功能
> 2. 在Python 3中,没有旧式类,只有新式类,也就是说不用再像这样 class Foobar(object): pass 显式地子类化object
但是最好还是加上. 主要区别在于 old-style 是 classtype 类型而 new-style 是 type类型
> 3. 原来1/2(两个整数相除)结果是0,现在是0.5了
python 2.2+ 以上都可以使用 from __future__ import division 实现改特性, 同时注意 // 取代了之前的 / 运算
> 4. 新的字符串格式化方法format取代%
错误, 从 python2.6+ 开始已经在str和unicode中有该方法, 同好碰时 python3依然支持 % 算符
> 6. xrange重命名为range
同时更改的还有一系列内置函数及方法, 都返回迭代器对象, 而不是列表或者 元组, 比如 filter, map, dict.items 等
> 7. !=取代 < >
python2 也很少有人用 < > 所以不算什么修改
> 8. long重命名为int
不完全对, python3 彻底废弃了 long+int 双整数实现的方法, 统一为 int , 支持高精度整数运算.
> 9. except Exception, e变成except (Exception) as e
只有 python2.5 及以下版本不支持该语法. python2.6 是支持的. 不算新东西
> 10. exec变成函数
类似 print() 的变化, 之前是语句.

简单补充下
* 主要是类库的变化, 组织结构变了些. 但茄袜袭功能没变. urlparse - > urllib.parse 这样的变化
* 最核心的变化它没有说, 对 bytes 和 原生 UNICODE 字符串的支持, 删除了 unicode 对象颤兄, str 为原生 unicode 字符串, bytes 替代了之前的 str 这个是最核心的.
知乎转载

⑦ python3不完全支持python2的缩进策略对吗


python3不完全支持python2的缩进策略是对的
望采纳,谢谢

阅读全文

与python3新式类相关的资料

热点内容
760贴片机编程视频 浏览:333
欧姆龙plc编程第36讲 浏览:911
我的世界如何将一个服务器弄崩 浏览:8
php网站访问量代码 浏览:431
怠速压缩机咔咔响 浏览:176
怎么才能修改APP中的数据 浏览:688
哪里有抢单的app 浏览:462
算法概率题 浏览:465
长方形拉伸的命令 浏览:279
python代码函数编程技术 浏览:194
java正则式 浏览:429
外包程序员好进吗 浏览:384
云服务器服务模型架构 浏览:901
删文件夹什么指令 浏览:509
极速抖音已加密怎么办 浏览:603
matlab拉格朗日算法框图 浏览:430
华为公司计算机视觉算法顾问 浏览:254
夏老师讲的单片机 浏览:298
在编程中如何将图片放大 浏览:163
appstore怎么看是否付费 浏览:603