2014-11-25 44 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 
相关问题