① 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的縮進策略是對的
望採納,謝謝