上一次,我们做了一个计算给出年份的天干、地支、生肖的程序。里面应用了一个自定义类
class nowyear(object):
year = 2021
gan = 6
zhi = 0
那能不能将这个类丰富些呢?
我们现在没有做类的实例化属性和方法,那我们把这个类改写下,把属性和方法都添加一下。
源文件:
gan = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
zhi = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
shengxiao = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪']
class nowyear(object):
year = 2021
gan = 6
zhi = 0
def js():
iyear = int(input('请输入年份:'))
#计算差值
i = nowyear.year-iyear
#获得干支和生肖的数字
igan = i % 10
izhi = i % 12#生肖一致
#列出天干地支和生肖
igan = nowyear.gan-igan
izhi = nowyear.zhi-izhi
print(str(iyear),'年:',gan[igan]+zhi[izhi]+shengxiao[izhi])
js()
js()
我们先把前面的3个列表放到类里面。
class nowyear(object):
gan = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
zhi = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
shengxiao = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪']
year = 2021
gan = 6
zhi = 0
把名字改一下,其他地方用不到,也不让用。那就在前面和后面都加上双下划线“__”。
几个属性也改下名字,前面加上o,表示之前的
class nowyear(object):
__gan__ = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
__zhi__ = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
__shengxiao__ = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪']
oyear = 2021
ogan = 6
ozhi = 0
“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
“双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
现在属性有了,我们开始写类的方法。
需要什么方法呢?那就要看我们要获得什么了。
需要的是:1天干;2地支;3生肖
天干: get_gan
地支: get_zhi
生肖: get_sheng
下面开始写:
天干:
def get_gan():
return self.__gan__[igan]
属性前面一定要加self.!
现在我们来找igan是什么?
之前的代码里:
igan = nowyear.gan-(i % 10)
把nowyear换成self,再加上双下划线,就成了:
igan = self.ogan-(i % 10)
那这里的i是什么?
之前的代码里:
i = nowyear.year-iyear
i是年份差值,那我们改一下,就是:
igan = self.ogan-((self.oyear-iyear) % 10)
接着往前放:
def get_gan():
return self.__gan__[self.ogan-((self.oyear-iyear) % 10)]
天干有了,现在换地支:
def get_zhi():
return self.__zhi__[self.ozhi-((self.oyear-iyear) % 12)]
看到简单的方面了吗?只要把__gan__换成__zhi__,ogan换成ozhi,其他都不用变!我好聪明!
要注意地支的取余用的是12,不是10,这里要改哦~
接下来是生肖:
def get_sheng():
return self.__shengxiao__[self.ozhi-((self.oyear-iyear) % 12)]
生肖直接照搬地支!我太聪明了!
现在的类就成了:
class nowyear(object):
__gan__ = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
__zhi__ = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
__shengxiao__ = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪']
oyear = 2021
ogan = 6
ozhi = 0
def get_gan(self,newyear):
return self.__gan__[self.ogan-((self.oyear-newyear) % 10)]
def get_zhi(self,newyear):
return self.__zhi__[self.ozhi-((self.oyear-newyear) % 12)]
def get_sheng(self,newyear):
return self.__shengxiao__[self.ozhi-((self.oyear-newyear) % 12)]
看,我在每个函数的括号里放入了slef和newyear。这样就可以在使用函数的时候往里传参了。self表示类自身,newyear就是用input输入的年份,这里用newyear传进来。
接下来,我们再删掉些东西!属性!
oyear = 2021
ogan = 6
ozhi = 0
这些要他何用,也不会变了,直接用这些数字替换掉!
class nowyear(object):
__gan__ = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
__zhi__ = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
__shengxiao__ = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪']
def get_gan(self,newyear):
return self.__gan__[6-((2021-newyear) % 10)]
def get_zhi(self,newyear):
return self.__zhi__[0-((2021-newyear) % 12)]
def get_sheng(self,newyear):
return self.__shengxiao__[0-((20231-newyear) % 12)]
这些都写完了,现在这个类就可以直接使用了。
试一下
n = nowyear()
print(n.get_gan(2022))
print(n.get_zhi(2022))
print(n.get_sheng(2022))

(鼓掌……撒花……)
等等!……刚说好的实例化呢?
那 就继续写吧
def __init__(self,newyear=2021):
self.year = newyear
self.gan = self.get_gan(newyear)
self.zhi = self.get_zhi(newyear)
self.shengxiao = self.get_sheng(newyear)
实例化的时候接收一个参数newyear,然后生成天干、地支、生肖赋值给自身属性。
我们给newyear一个默认值,如果不传入参数的话,使用默认值作为参数。
好了,我们再试下
n = nowyear(2022)
print(n.nyear)
print(n.ngan)
print(n.nzhi)
print(n.shengxiao)

我们再稍微改上一下
n = nowyear(2022)
print('{}年,是{}年'.format(str(n.year),n.gan+n.zhi+n.shengxiao))

好了,继续鼓掌……撒花……
然后,我们把上面的代码写成一个方法~
def showit(self):
print('{}年,是{}年'.format(str(self.year),self.gan+self.zhi+self.shengxiao))
我们试下~
n = nowyear(2038)
n.showit()
查看结果

鼓掌~
撒花~
全部源码:
class nowyear(object):
__gan__ = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
__zhi__ = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
__shengxiao__ = ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪']
def get_gan(self,newyear):
return self.__gan__[6-((2021-newyear) % 10)]
def get_zhi(self,newyear):
return self.__zhi__[0-((2021-newyear) % 12)]
def get_sheng(self,newyear):
return self.__shengxiao__[0-((20231-newyear) % 12)]
def __init__(self,newyear=2021):
self.year = newyear
self.gan = self.get_gan(newyear)
self.zhi = self.get_zhi(newyear)
self.shengxiao = self.get_sheng(newyear)
self.shengxiao = self.get_sheng(newyear)
def showit(self):
print('{}年,是{}年'.format(str(self.year),self.gan+self.zhi+self.shengxiao))
n = nowyear(2038)
n.showit()
总结:
1、自定义类里面的双下划线有特殊意义。
2、自定义类如果不想实例化的时候带参数,可以赋给一个默认值。
3、该加self的地方不能忘了~
本文介绍了如何改进一个Python类,用于计算年份对应的天干、地支和生肖。通过将数据移入类中并创建相应的方法,实现了属性私有化,并演示了类的实例化及方法调用,简化了之前的代码结构。
1万+

被折叠的 条评论
为什么被折叠?



