本文以GitHub上100天python从新手到大师为素材,规划为约100天的练习,每次的学习和总结均发在这里。有错误的地方还请朋友们指正。
@property装饰器
在上一篇文章中我们有防止类中的属性被访问的方法,但仍然有暴露的可能,现在我们可以用装饰器@property来包装getter和setter方法来起到类属性的访问和修改功能,这样子对属性的访问既安全又方便,示例如下:
class person(object):
def __init__(self, name, age):
self._name = name
self._age = age
#访问器-getter方法
@property
def name(self):
return self._name
@property
def age(self):
return self._age
#修改器-setter方法
@age.setter
def age(self, age):
self._age = age
def play(self):
print(self._name, self._age)
dy = person('dy',24)
dy.play()
dy.age = 100
dy.play()
dy.name = 'yd'
#dy.name = 'yd'
#AttributeError: can't set attribute
根据示例代码我们可以看到,如果我们没有对属性进行setter方法的编辑,对属性修改就会报错。从而达到不能够修改的目的。
slot魔法方法
python是一门动态语言,也就是可以在程序运行的时候给对象绑定新的属性和方法,但如果我们需要限定对象只能绑定指定的属性,我们可以用__ slot __ 魔法方法绑定类内的属性,可以理解为这个类内只可以绑定slot指定的属性,而不能再添加其他的属性。slot只对当前类生效,对它的子类不生效。
下面是示例代码
class people(object):
__slots__ = ('_name', '_age', '_gender')
def __init__(self, name, age, gender):
self._name = name
self._age = age
self._gender = gender
@property
def age(self):
return self._age
@property
def name(self):
return self._name
@age.setter
def age(self, age):
self._age = age
def play(self):
print(self._age, self._name)
dy = people('yd', 23, 'male')
dy.play()
dy.pee = 3
#AttributeError: 'people' object has no attribute 'pee'
从示例代码里我们可以看出,在使用slot绑定name、age、gender三个属性后,如果想再向“dy”这个实例中添加一个pee属性就会报错了。
静态方法和类方法
静态方法
我们之前学习的都是对象方法,就是说这些方法都是发送给对象的消息。而静态方法是一种不使用类属性的方法,静态方法可以理解成存在类内但是与类无关的方法,比如有一个三角形的类,需要输入三条边的边长从而计算三角形面积,但在此之前我们需要做的是判断输入的三条边能否构成三角形,这时候静态方法就起到了这个作用,静态方法使用@statemethod来定义,下面是示例代码:
from math import sqrt
class triangel(object):
def __init__(self, a, b, c):
self._a = a
self._b = b
self._c = c
@staticmethod
def is_vaild(a, b, c):
return a+b>c and b+c>a and a+c>b
def perimeter(self):
return self._a + self._b + self._c
def area(self):
half = triangel.perimeter(self)/2
return sqrt(half* (half - self._a)* (half- self._b)* (half - self._c))
if triangel.is_vaild(3, 4, 5):
tri = triangel(3, 4, 5)
zhouchang = tri.perimeter()
mianji = tri.area()
print(zhouchang, mianji)
从上面的代码看出我们在构建前可以先使用静态方法 is._vaild来判断,之后再计算周长和面积。
类方法
类方法是以类为对象操作的方法,使用装饰器@classmethod,约定的参数对象为cls,当逻辑上采用方法对类操作而不是对实例对象操作时采用,例如当我们建立一个班级类,它的子类是学生,并且我们想知道班里一共创建了多少学生,这时候显然不能在学生实例里操作,也不可能为了计算学生人数创建一个班级实例。(此处参考了蔷薇的文章
)下面是示例代码:
class ClassTest(object):
__num = 0
@classmethod
def addNum(cls):
cls.__num += 1
@classmethod
def getNum(cls):
return cls.__num
# 这里我用到魔术方法__new__,主要是为了在创建实例的时候调用累加方法。
def __new__(self):
ClassTe