class MyClass:
pi = 3.14 # 因为pi前没有self所以pi属于MyClass这个类,因此也属于该类将来创建的实例。对于实例而言它就叫做self.pi,而对于类而言它就叫做MyClass.pi。
def __init__(self,value=42):
self.tmp = value #因为tmp前面加上了self,所以这里的self.tmp不属于类(即不存在MyClass.tmp)而是属于该类创建的实例,因为带self的是实例的属性,不是类的属性,带self的只存在于实例中。
>>> f = MyClass() #创建实例
>>> f.tmp #tmp是在类中带上了self所以tmp是实例属性,f就是实例。
42
>>> MyClass.tmp #tmp不是类属性,所以这个将会失败
Traceback (most recent call last):
......
>>> MyClass.pi #pi是类属性
3.14
>>> f.pi #pi前没有self,所以pi既是类属性也是由类创建出来的实例属性。
3.14
9.5.1 函数property的理解
class Rectangle:
def __init__ (self):
self.width = 0
self.height = 0
self.area = 0
def set_size(self, size):
self.width, self.height = size #将高和宽都称为size,这样管理起来比较方便
self.area = self.width * self.height = size
def get_size(self):
return self.width, self.height
size = property(get_size,set_size) #获取方法在前,设置方法在后。这里其实产生的是self.size,这里省略了self
rect = Rectangle()
print (rect.get_size())
rect.size = 10,5 #将宽高理解成一组东西,叫做size,对size这一个属性进行更改,就相当于更改了两个属性。size是类(Rectangle())中一个实例(rect)的属性。可以直接在外面进行赋值操作。执行赋值语句的时候会调用set_size的方法,将10和5作为参数,传递进去。
print (rect.get_size())
print (rect.size)
#有一些属性,然后定义一个设置这些属性的方法(给它们取一个名字,这里是size),再定义一个获取这些属性的方法,然后给
还可以计算面积
9.5.2 静态方法和类方法
#一般的对象方法在没有创建实例的时候没法调用
class MyClass:
def foo(self):
print ('hi')
MyClass.foo() #没有创建实例,无法调用方法
tmp = MyClass() #创建实例tmp
tmp.foo() #通过实例调用方法
#不创建实例有三种策略可使函数在外部被调用;
#其实也可以
#策略一:
MyClass().foo()
#策略二:静态方法
class MyClass:
def foo():
print ('hi')
foo = staticmethod(foo)
#策略三:类方法.
#类方法中要包含参数cls
class MyClass:
def foo(cls):
print ('hi')
foo = classmethod(foo)