熟悉面向对象思想的同学,应该都知道其三大特征:封装,继承和多态。在任何支持面向对象思想的编程语言当中,都进行了体现。这一章当中通过完成判定结婚系统,介绍一下封装特征中的私有化等知识点。
需求分析:
涉及到的知识点:
- 面向对象类的封装,属性私有化封装
- 对象作为函数的参数进行传递,与对象类型的判断
- 异常的处理与抛出
逻辑分析:
原题为JAVA试题,gender为性别,题目中为boolean类型,在此题中,我将gender改动为字符串类型,可输入“男”或“女”,其他数据则提示异常,设计个函数marry用于判断是否能够结婚,排除所有不能够结婚的条件,最终依然继续执行,便是可以结婚。
功能实现代码:
class Person(object):
def __init__(self,name,age,gender,partner=None):
self.__name = name
self.__age = age
self.__gender = gender
self.__partner = partner
def setName(self,name):
self.__name = name
def getName(self):
return self.__name
def setAge(self,age):
if not isinstance(age,int):
raise ValueError('age must be type int')
if age<1 or age>120:
raise ValueError('age must be between 1 and 120')
self.__age = age
def getAge(self):
return self.__age
def setGender(self,gender):
if gender=='男' or gender=='女':
self.__gender = gender
else:
raise ValueError('sex must be 男 or 女')
def getGender(self):
return self.__gender
def setPartner(self,partner):
if partner ==None:
self.__partner = None
return
if not isinstance(partner,Person):
raise ValueError('partner type must be Person')
self.__partner = partner
def getPartner(self):
return self.__partner
def __str__(self):
if self.__partner != None:
str = '名字:%s,年龄:%d,性别:%s,配偶:%s'%(self.__name,self.__age,self.__gender,self.__partner.getName())
return str
else:
str = '名字:%s,年龄:%d,性别:%s,没有结婚' % (self.__name, self.__age, self.__gender)
return str
# 判断结婚的方法
def marry(self,operson):
if self.getGender() == operson.getGender():
print('在中国,同性暂时不能结婚')
elif self.getGender() =='男':
if self.getAge()<24 or operson.getAge()<22:
print("还未到法定结婚年龄,过几年在来吧!!")
elif self.getPartner()!=None or operson.getPartner()!=None:
print("在中国重婚是犯法了,不能结婚!!")
else:
print("恭喜%s和%s新婚快乐,百年好合!!"%(self.getName(),operson.getName()))
self.setPartner(operson)
operson.setPartner(self)
elif self.getGender() == '女':
if self.getAge()<22 or operson.getAge()<24:
print("还未到法定结婚年龄,过几年在来吧!!")
elif self.getPartner() != None or operson.getPartner() != None:
print("在中国重婚是犯法了,不能结婚!!")
else:
print("恭喜%s和%s新婚快乐,百年好合!!" % (self.getName(), operson.getName()))
self.setPartner(operson)
operson.setPartner(self)
else:
print('系统出现故障了,不能结婚!')
# 离婚
def divorce(self):
# 判断是否已经结婚了
if self.getPartner() == None:
print('醒醒吧,还没结婚呢,无法办理离婚手续!')
else:
partner = self.getPartner()
self.setPartner(None)
partner.setPartner(None)
if __name__ == '__main__':
#实例化对象
p1 = Person('李雷',18,'男')
p2 = Person('韩梅梅',17,'女')
p1.marry(p2)
p3 = Person('Jack',20,'男',None)
p1.marry(p3)
print("======六年后======")
p1.setAge(24)
p2.setAge(23)
p3.setAge(26)
p4 = Person('Rose',23,'女',None)
p1.marry(p4)
p1.marry(p2)
#p2.marry(p3)
p1.divorce()
p1.marry(p2)
p3.divorce()
p3.marry(p4)
print(p1)
print(p2)
需要注意的是,在确定两个Person对象能够结婚后,除了打印恭喜结婚的讯息之外,还应该将此对象与其结婚对象伴侣属性赋值给对象,否则下一次此对象调用结婚方法,依然能够结婚,并没有起到作用。self.setPartner(operson) 与operson.setPartner(self)这两句代码非常关键。属于登记颁发结婚证的过程,对双方都起到了约束作用。
此外,我还增加了离婚的方法,当前对象调用离婚方法后,确认其已婚身份,然后就可以将其伴侣属性和其配偶的伴侣属性都设置为None,即完成这函数功能。
上述代码运行后,会实现的效果为:
通过运行我们见证了好一场跌宕起伏的狗血多角恋情,好神奇~ 使用双下划线__就可以将属性和函数进行私有化,只能够在本类当中访问,不能够在其他类当中访问~ 感谢您的阅读!
代码下载路径:https://download.csdn.net/download/u012156341/11125722