python - Python:如何在另一个程序私有类中对列表进行排序
问题描述
我正在尝试对私有类中的列表进行排序,我可以对其进行排序而无需私有化,但不能私有化。
首先我打开数据并将其拆分到 main.py 中,并在 main.py 中设置一个列表调用 StudentDL 并将其调用到 Student.py ,如果我私有 Student.py,我无法对 main.py 中的 StudentDL 列表进行排序。
如何在私有 Student.py 之后对 main.py 或 Student.py 中的 StudentDL 列表进行排序?
主要.py:
from Student import Student
StudentDL = []
file = open('markdata.dat', 'r')
line = file.readline()
while line != '':
StudentRec = line.split('_')
StudentDL.append(Student(int(StudentRec[0]),str(StudentRec[1]),
float(StudentRec[2]),
float(StudentRec[3])))
line = file.readline()
file.close()
for e in StudentDL:
print (e)
for e in sorted(StudentDL, key=lambda c:c.sID):
print (e)
print('='*20)
for e in sorted(StudentDL, key=lambda c:c.n):
print (Student.overall(e))
学生.py:
class Student(object):
numStudent = 0
def __init__(self,studentID,name,cwmark,exammark):
Student.numStudent += 1
self.__sID = studentID
self.__n = name
self.__cwm = cwmark
self.__exm = exammark
self.__om = (cwmark*0.4)+(exammark*0.6)
def __str__(self):
return '%-15s%-27s%-10.2f%7.2f'%\
(self.__sID,self.__n,self.__cwm,self.__exm)
def overall(self):
return '%-15s%-27s%-12.2f%-7.2f%8.2f'%\
(self.__sID,self.__n,self.__cwm,self.__exm,self.__om)
def getoverall(self):
return float(self.__om)
标记数据:
50123456_lam tai man_70.0_60.0_
50223456_li tai man_60.0_90.5_
50323456_wong tai man_34.5_30.0_
50423456_ng tai man_90.5_70.0_
50523456_lau tai man_86.0_92.4_
50623456_chui tai man_70.0_64.5_
50723456_lim tai man_64.5_60.0_
50823456_pok tai man_37.5_35.50_
50923456_kim tai man_92.4_60.0_
50023456_tsang tai man_15.0_20.0_
50999999_chan peter_100.00_80.00_
解决方案
为什么您希望能够从类外部访问私有属性?私有属性的全部意义在于防止这种情况发生(Python可以很容易地解决它,但是当你这样做时你明确地违反了封装)。
如果变量应该是逻辑可读的,隐私主要用于防止写入,Student
可以声明@property
访问器:
class Student(object):
numStudent = 0
def __init__(self,studentID,name,cwmark,exammark):
...
@property
def n(self):
return self.__n
@property
def sID(self):
return self.__sID
如果不需要这种保护,那么只需__
首先声明您的属性而不带前导,然后将它们公开。
推荐阅读
- javascript - USB 条码扫描器重复扫描,无需服务器调用
- regex - Powershell 正则表达式用连字符替换下划线
- python - UBlox NAV_PVT 消息:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5
- html - 如何处理网站中服务器根目录上方的文件
- r - 是否可以在 R 中运行时设置函数的环境?
- ruby - 网络爬行。无法正确抓取数据
- rust - Rust 借用某些对象类型而不是其他对象类型?
- ubuntu - 如何将 *.tgz 的内容列表转储到文本文件而不提取它(Ubuntu)?
- makefile - 如何查看“make”执行的命令?
- jquery - 在滚动时执行此操作,然后在滚动时执行此操作