已经两天没更新了,这两天比较心烦气燥,什么都看不下去,学不下去,大概是“大姨父”来了。连续两天站桩还真是累得不行,希望最佳状态快些回来吧,今天继续。
自定义类有两种语法格式:
class className:
suit
这种语法格式不指定基类,在Python中,不指定基类的话,默认的基类就是object。所以在Python中,所有的类都是object的子类。如果要指定基类就要用另一种语法格式:
class className(base_classes):
suit
其中的base_classes就是新创建的类的基类。在suit中就可以定义新类的方法了,用def来创建,就像创建一个全局函数那样。
在定义函数的过程中,可以使用一个隐含的参数self用来指代自己,就像C++中的this,只是在使用self的时候必须显式的使用,不能像this那样省略掉。
在Python中,创建对象分两个步骤,首先是创建一个原始对象,会调用__new__(),然后初始化对象,会调用__init()。在自定义类的时候,一般__new__()都不需要重新写,而__init__()几乎都要重写。
像这种在函数名开始和结尾处都有两个下划线的方法是特殊方法,自己定义的一般方法不应该以这样的方式命名,以防跟以后升级版本的特殊方法冲突。在子类的方法中如果想要调用基类的方法,可以使用super()来指定基类,然后用点操作符来调用基类的方法。
特性
如果想要对自定义类中的属性进行控制,可以使用特性来实现。
像圆类中的求面积函数,求周长函数等其实都可以看作是类的一个成员变量来取用,只是只读的,这样的成员函数完全可以用特性来描述。这样在需要这个值的时候,直接用特性而不需要调用方法就可以了。特性和方法的最显著的区别就是修饰器。修饰器是一个函数,该函数以一个函数或方法为参数,并返回参数修饰后的版本。修饰器是通过在名字前使用@符号来标记的。比如property修饰器函数,这个修饰器函数是一个内置函数,至多可以接受4个参数:一个获取者函数,一个设置者函数,一个删除者函数以及一个docstring。使用@property的效果与仅使用一个参数(获取者函数)调用property的效果是一样的,例如:
def area(self):
return math.pi*(self.redius**2)
area = property(area)
更常用的是以下这种方式:
@property
def area(sef):
return math.pi*(self.redius**2)
另外,很重要的一个,就如一开始所说的,可以把属性转换成特性来对其进行控制,这样,我们必须创建一个私有的属性,其中实际存放了数据,并提供获取者方法与设置者方法。私有的属性用前面以两个下划线开始,如:__radius等,然后定义其各种方法:
@property
def radius(self):
"""注释注释
注释注释
"""
return self.__redius
@redius.setter
def radius(self, radius):
assert radius > 0, "radius must be......"
self.__radius = radius
这两个方法是获取者方法和设置者方法,其他的两个发展由Python来设定。