我写这个课:
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
不是班级?
答案 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)
在新的样式类中,每object
个class object
类继承instance
类type
。
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'>
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