Python 自定义类的进阶运用,改写计算给出的年份的干支和生肖

本文介绍了如何改进一个Python类,用于计算年份对应的天干、地支和生肖。通过将数据移入类中并创建相应的方法,实现了属性私有化,并演示了类的实例化及方法调用,简化了之前的代码结构。

上一次,我们做了一个计算给出年份的天干、地支、生肖的程序。里面应用了一个自定义类

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的地方不能忘了~

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值