Python严格要求需要有实例才能调用方法,这种限制实际上就是Python的绑定机制。
>>> class A:
def printA():
print("Life is short")
>>> A.printA()
Life is short
这么做会存在一个问题,就是根据类实例化后的对象无法使用类里面的函数
>>> a = A()
>>> a.printA()
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
a.printA()
TypeError: printA() takes 0 positional arguments but 1 was given
在深入了解一下
>>> class C:
def setXY(self,x,y):
self.x = x
self.y = y
def printXY(self):
print(self.x,self.y)
>>> d = C()
使用dict查看对象拥有的属性
>>> d.__dict__
{}
>>> C.__dict__
mappingproxy({'__module__': '__main__', 'setXY': <function C.setXY at 0x0000000002E13AE8>, 'printXY': <function C.printXY at 0x0000000002E13B70>, '__dict__': <attribute '__dict__' of 'C' objects>, '__weakref__': <attribute '__weakref__' of 'C' objects>, '__doc__': None})
dict属性由一个字典组成,键表示属性名,值表示数据值。
>>> d.setXY(8,9)
>>> d.__dict__
{'x': 8, 'y': 9}
把类实例删除掉,实例对象d仍然能调用printXY
>>> del C
>>> d.printXY()
8 9
issubclass(class,classinfo)
如果第一个参数(class)是第二个参数(classinfo)的一个子类,返回True,否则返回False:
>>> class A:
pass
>>> class B(A):
pass
>>> issubclass(B,A)
True
>>> issubclass(B,B)
True
>>> issubclass(B,object)
True
>>> class C:
pass
>>> issubclass(B,C)
False
isinstance(object,classinfo)
如果第一个参数(object)是第二个参数(classinfo)的实例对象,则返回True,否则返回False:
>>> b1 = B()
>>> isinstance(b1,B)
True
>>> isinstance(b1,C)
False
>>> isinstance(b1,A)
True
>>> isinstance(b1,(A,B,C))#只要class是其中任何一个候选类的子类,就返回True.
True
hasattrr(object,name)
attr是attribute的缩写,是属性的意思。
>>> class C:
def __init__(self,x=0):
self.x = x
>>> c = C()
>>> hasattr(c,'x') # 属性名要用引号括起来
True
getattr(object,name[,default])
返回对象指定的属性值,如果指定的属性不存在,则返回default(可选参数)的值;若没有设置default参数,则抛出ArttributeError异常。
>>> getattr(c,'x')
0
>>> getattr(c,'y')
Traceback (most recent call last):
File "<pyshell#57>", line 1, in <module>
getattr(c,'y')
AttributeError: 'C' object has no attribute 'y'
>>> getattr(c,'y','您所访问的属性不存在')
'您所访问的属性不存在'
setattr(object,name,value)
与getattr()对应,setattr()可以设置对象中指定属性的值,如果指定的属性不存在,则会新建属性并赋值。
>>> setattr(c,'y','Billep')
>>> getattr(c,'y')
'Billep'
delattr(object,name)
与setattr()相反,delattr()用于删除对象中指定的属性,如果属性不存在,则会抛出AttributeError异常。
>>> delattr(c,'y')
>>> delattr(c,'z')
Traceback (most recent call last):
File "<pyshell#66>", line 1, in <module>
delattr(c,'z')
AttributeError: z
property(fget = None,fset = None,fdel = None,doc = None)
作用是通过属性来设置属性。
class C:
def __init__(self,size = 10):
self.size = size
def getSize(self):
return self.size
def setSize(self,value):
self.size = value
def delSize(self):
del self.size
x = property(getSize,setSize,delSize)
>>> c = C()
>>> c.x
10
>>> c.x = 12
>>> c.x
12
>>> c.size
12
>>> del c.x
>>> c.size
Traceback (most recent call last):
File "<pyshell#103>", line 1, in <module>
c.size
AttributeError: 'C' object has no attribute 'size'
property()返回一个可以设置属性的属性,有了Property()用户访问size属性只提供了x属性,无论内部怎么改动,只需要相应的修改property()的参数,用户只需要去操作x属性即可。