面向对象进阶
在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象编程进行更为深入的了解。
@property装饰器
之前我们讨论过Python中属性和方法访问权限的问题,虽然我们不建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效。我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便,代码如下所示。
静态方法和类方法
之前,我们在类中定义的方法都是对象方法,也就是说这些方法都是发送给对象的消息。实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。我们可以使用静态方法来解决这类问题,代码如下所示。
综合案例
案例(1)
class name(object):
def init(self):
pass
def yx(self):
res = input(["*邮件地址"])
print(res)
def mm(self):
self.res1 = input(["*密码:"])
print(self.res1)
def xmm(self):
res2 = input(["*确认密码:"])
print(res2)
if self.res1 == res2:
print("密码设置成功:")
else:
print("两次密码输入不一致请重新输入")
def ycm(self):
import random
a = random.randrange(1000,10000)
print(a)
res3 =int(input(["请输入验证码:"]))
if res3 != a:
print("输入错误")
def yz(self):
for i in range(1,5)
i=i+1
res4 = int(input(""))
else:
print("验证成功")
name=name()
name.yx()
name.mm()
name.xmm()
name.ycm()
[’*邮件地址’]1
1
[’*密码:’]1
1
[’*确认密码:’]1
1
密码设置成功:
1665
[‘请输入验证码:’]1665
验证成功
案例(2)
class Name(object):
def init(self,a,b,c):
self.__a = a
self.__b = b
self.__c = c
@property
def a(self):
print(self.__c)
@a.setter
def a(self,x):
self.__c = x
def X(self):
print(self.__a+self.__b+self.__c)
name = Name(10,12,14)
name.a = 100
name.X()
122