为什么不上课?

时间:2014-11-25 08:59:04

标签: python python-2.7

我写这个课:

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不是班级?

6 个答案:

答案 0 :(得分:3)

您正在使用 plain 类语句创建旧的(2.2之前的)Python类。

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

尝试:

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

没有 bases class语句会创建经典类。要创建新的样式类,您必须指定object作为基础。

types.ClassType类似于<type 'type'>实例 types

答案 1 :(得分:0)

在新的样式类中,每objectclass 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__'

答案 2 :(得分: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模块的类型。

Class的类型为ClassType

答案 3 :(得分:0)

因为类型派生自对象:

在没有父类的python2类中,类型为classobj。在python3中,这改变了没有父类的类,默认情况下从object继承。

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


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

点击此链接了解详情:https://wiki.python.org/moin/NewClassVsClassicClass

答案 4 :(得分:0)

在Python的古老版本中(在v2.2之前),一个类是一个特殊的东西(classobj),与type分开:

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

这是"old style class"

Python 2.2以后你通常应该总是使用&#34; new style&#34;类,通过继承自object(或其某些子类)来定义:

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

关于Python中类的历史有一篇很好的帖子,解释了区别 - "New-style Classes" on The History of Python博客(由Python的创建者编写)

在Python 3中,删除了这种区别,因此上面的两个类定义都是相同的:

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

答案 5 :(得分:0)

我只是从对象继承该类,现在它说它是一个类。

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