2014-11-25 61 views
0

我寫這個類:爲什麼不上課?

class Sensor: 
    def __init__ (self,sensor_class_name, data): 
     self.sensor_class_name = sensor_class_name 
     self.data    = data 

當我做這個檢查:

if type(Sensor) == type: 
    print("type") 

else: 
    print("not type") 

它返回not type

當我在內置的類中檢查時,它返回type

爲什麼Sensor不是一個類?

回答

3

您正在創建使用普通類聲明一個類舊的(預2.2)的Python。

>>> type(Sensor) 
<type 'classobj'> 

嘗試:

>>> import types 
>>> types.ClassType is type(Sensor) 
True 

一個class聲明沒有基地創建經典類。爲了創建一個新的風格類,你必須指定object作爲基礎。

types.ClassType酷似<type 'type'>情況下,它類型

0

在新風格的類,以便從object類繼承每個class object類是instancetype類。

print isinstance(Sensor, type) # True 

    class Sensor: 
     def __init__ (self,sensor_class_name, data): 
      .. 
      .. 
    if type(Sensor) == type: 
     print("type") 
    else: 
     print("not type") 
    print isinstance(Sensor, type) 

Ouput:- 
    >>> 
    not type 
    Flase 

雖然newstyle classes: -

class Sensor(object): 
    ... 
    ... 
print isinstance(Sensor, type) 
>>> 
type 
True 

還: -

In [52]: class A: pass 

In [53]: type(A) 
Out[53]: classobj 

In [54]: class B(object):pass 

In [55]: type(B) 
Out[55]: type 

In [56]: B.__class__ 
Out[56]: type 

In [57]: A.__class__ 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-57-5b54bd730948> in <module>() 
----> 1 A.__class__ 

AttributeError: class A has no attribute '__class__' 
0
>>> import types 
>>> dir(types) 
['BooleanType', 'BufferType', 'BuiltinFunctionType', 'BuiltinMethodType', 'ClassType', 'CodeType', 'ComplexType', 'DictProxyType', 'DictType', 'DictionaryType', 'EllipsisType', 'FileType', 'FloatType', 'FrameType', 'FunctionType', 'GeneratorType', 'GetSetDescriptorType', 'InstanceType', 'IntType', 'LambdaType', 'ListType', 'LongType', 'MemberDescriptorType', 'MethodType', 'ModuleType', 'NoneType', 'NotImplementedType', 'ObjectType', 'SliceType', 'StringType', 'StringTypes', 'TracebackType', 'TupleType', 'TypeType', 'UnboundMethodType', 'UnicodeType', 'XRangeType', '__builtins__', '__doc__', '__file__', '__name__', '__package__'] 

>>> class Sensor: 
...  pass 
... 
>>> if type(Sensor) == types.ClassType: 
...  print "type" 
... else: 
...  print "not type" 
... 
type 
>>> type(type) 
<type 'type'> 
>>> type(Sensor) 
<type 'classobj'> 

type本身是types模塊的類型。

ClassClassType的類型。

0

由於類型從對象導出:

在python2類沒有父類是類型classobj。在python3中,這改變了,沒有父類的類默認從對象繼承。

class A: pass 
print type(A) 
<type 'classobj'> 


class B(object): pass 
print type(B) 
<type 'type'> 

檢查該鏈接以獲得更多信息:https://wiki.python.org/moin/NewClassVsClassicClass

0

在古代版本的Python(v2之前)2)班是一個特別的東西(classobj),從type獨立:

>>> class OldStyleClass: 
...  pass 
... 
>>> type(OldStyleClass) 
<type 'classobj'> 

這是一個"old style class"

的Python 2.2起,你通常應該總是使用「新風貌」類,這是由定義從object繼承(或它的某些子類):

>>> class NewStyleClass(object): 
...  pass 
... 
>>> type(NewStyleClass) 
<type 'type'> 

有關於在Python類歷史上的一個很好的職位,解釋的區別 - "New-style Classes" on The History of Python博客(軟件寫N乘的Python的創建者)

在Python 3,這種區別已被刪除,因此兩者的類定義的,前述情況是相同的:

>>> class Blah: 
...  pass 
... 
>>> type(Blah) 
<class 'type'> 
>>> 
>>> class Blah(object): 
...  pass 
... 
>>> type(Blah) 
<class 'type'> 
0

我剛繼承對象的類,而現在它說它是一個班級。

class Sensor (object): 
    def __init__ (self,sensor_class_name, data): 
     self.sensor_class_name = sensor_class_name 
     self.data    = data 
相關問題