導航:首頁 > 編程語言 > 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新式類相關的資料

熱點內容
歐姆龍plc編程第36講 瀏覽:907
我的世界如何將一個伺服器弄崩 瀏覽:6
php網站訪問量代碼 瀏覽:431
怠速壓縮機咔咔響 瀏覽:176
怎麼才能修改APP中的數據 瀏覽:688
哪裡有搶單的app 瀏覽:462
演算法概率題 瀏覽:465
長方形拉伸的命令 瀏覽:279
python代碼函數編程技術 瀏覽:194
java正則式 瀏覽:429
外包程序員好進嗎 瀏覽:384
雲伺服器服務模型架構 瀏覽:901
刪文件夾什麼指令 瀏覽:509
極速抖音已加密怎麼辦 瀏覽:603
matlab拉格朗日演算法框圖 瀏覽:430
華為公司計算機視覺演算法顧問 瀏覽:254
夏老師講的單片機 瀏覽:298
在編程中如何將圖片放大 瀏覽:163
appstore怎麼看是否付費 瀏覽:603
程序員和碩士 瀏覽:951