2021-05-04 16:23

# python初学者遇到一个问题，不知道怎么去改，烦请各路大神帮忙看一下，谢谢！

#!/usr/bin/python3
#schoolmis.py
import datetime
class person:

def __init__(self,nid,name,gender,birthday):
def isrunnian(year):
if (year%4==0 and year%400==0) or (year%4==0 and year%100!=0) :
return True
else :
return False

def isdate(*args):
if args[0]<0 or args[1]<0 or args[1]>12 or args[2]<0 or args[2]>31 :
return False
if isrunnian(args[0]) and args[1]==2 and args[2]<=29  :
return True
if args[1] in [1,3,5,7,8,10,12]  :
if args[2]<=31 :
return True
else :
return False
else :
if args[2] <=30 :
return True
else :
return False
if not (isinstance(name,str) and gender in ("F","M")):
raise ValueError("gender:",gender)
if not isdate(*birthday) :
raise  ValueError("birthday:",birthday)
try:
birth=datetime.date(*birthday)
except:
raise ValueError("birthday:",birthday)
self._nid=nid
self._name=name
self._gender=gender
self._birthday=birth
def __str__(self):
return ",".join((self._nid,self._name,self._gender,str(self._birthday)))

def birthday(self):
return self._birthday

def gender(self):
return self._gender

def name(self):
return self._name

def nid(self):
return self._nid
class student(person):
def __init__(self,nid,name,gender,birthday,study):
super().__init__(nid,name,gender,birthday)
self._study=study
self._score=dict()
def __str__(self):
return ",".join((super().__str__(),self._study))
def setscore(self,courseid,score):
self._score[courseid]=score
def score(self,courseid):
return self._score[courseid]
def scores(self):
return self._score
def setstudy(self,study):
self._study=study
def study(self):
return self._study
class manager(person):
def __init__(self,nid,name,gender,birthday,office):
super().__init__(nid,name,gender,birthday)
self._office=office

def __str__(self):
return ",".join((super().__str__(),self._office))

def setoffice(self,office):
self._office = office

def office(self):
return self._office
class teacher(person):
def __init__(self,nid,name,gender,birthday,department):
super().__init__(nid,name,gender,birthday)
self._department=department
def __str__(self):
return ",".join((super().__str__(),self._department))
def setdepartment(self,department):
self._department=department
def department(self):
return self._department
if __name__=="__main__" :
p1=person("001","张三","M",(2000,1,1))
print(p1)
print(p1.nid(),p1.name(),p1.gender(),p1.birthday())
s1=student("00001","王五","M",(2002,2,28),"哲学")
print(s1)
s1.setstudy("会计学")
s1.setscore("B001",89)
s1.setscore("B002",91)
print(s1)
print(s1.nid(),s1.name(),s1.gender(),s1.study(),s1.study(),s1.score("B001"),s1.scores())
t1=teacher("0001","元元","M",(1989,9,23),"讲师")
print(t1)
t1.setdepartment("副教授")
print(t1.department())
m1=manager("0002","白云","F",(1971,3,4),"教务处")
print(m1)
m1.setoffice("科技处")
print(m1.office())

• 点赞
• 写回答
• 关注问题
• 收藏
• 邀请回答

#### 4条回答默认 最新

• 天元浪子 2021-05-04 16:55
已采纳

题主贴出来的代码，问题不少。出现题主所说的错误，直接原因是person类的__str__、birthday、gender、name、nid这几个方法的缩进提前了，成了孤立的函数，导致找不到person的name方法。即使这个问题解决了，题主可能还会遇到其他问题，因为person类的构造函数里面有定义了两个内部函数isrunnian和isdate，isrunnian尽在isdate中被调用，而isdate则只被自身调用（递归），也就是说，在实例化的时候isdate函数不会被调用，里面的self._name=name自然也不会被执行。

点赞 评论
• CSDN专家-黄老师 2021-05-04 16:40

你定义的person没有name这个属性，你的类应该没定义吧

点赞 评论
• 有问必答小助手 2021-05-06 11:09

您好，我是有问必答小助手，您的问题已经有小伙伴解答了，您看下是否解决，可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案，可以点击【采纳】按钮，给回答的小伙伴一些鼓励哦～～

点赞 评论
• 有问必答小助手 2021-05-07 14:52

非常感谢您使用有问必答服务，为了后续更快速的帮您解决问题，现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中，希望能得到您的支持与协助！

速戳参与调研>>>https://t.csdnimg.cn/Kf0y

点赞 评论