#跟着教程学 10、类,面向对象。 +++升级练习题+++
如何通过python中的方法和属性获取类的属性
https://jingyan.baidu.com/album/5bbb5a1bd253bb13eba17914.html?picindex=4
# coding=utf-8 class Provice: memo = '中国的23个省会之一。' #静态字段 def __init__(self, name, captial, leader): self.Name = name #动态字段 self.Captial = captial self.Leader = leader def sports_meet(self): #动态方法 print self.Name + '正在开运动会' @staticmethod #静态方法 def Foo(): print '每个省都要带头反腐!' HB = Provice('河北','石家庄','李阳') #HB是对象,括号内属于封装 SD = Provice('山东', '济南', '王伟') print HB.Captial print HB.memo HB.sports_meet() Provice.Foo() 石家庄 中国的23个省会之一。 河北正在开运动会 每个省都要带头反腐!
class Cat: """定义一个猫类""" def __init__(self, new_name, new_age): """在创建完对象之后 会自动调用, 它完成对象的初始化的功能""" # self.name = "汤姆" # self.age = 20 self.name = new_name self.age = new_age # 它是一个对象中的属性,在对象中存储,即只要这个对象还存在,那么这个变量就可以使用 # num = 100 # 它是一个局部变量,当这个函数执行完之后,这个变量的空间就没有了,因此其他方法不能使用这个变量 def __str__(self): """返回一个对象的描述信息""" # print(num) return "名字是:%s , 年龄是:%d" % (self.name, self.age) def eat(self): print("%s在吃鱼...." % self.name) def drink(self): print("%s在喝可乐..." % self.name) def introduce(self): # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄)) # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age)) print("名字是:%s, 年龄是:%d" % (self.name, self.age)) # 创建了一个对象 tom = Cat("汤姆", 30) print(tom) tom.introduce()
类属性和类的方法
https://www.jianshu.com/p/202a289fb2d9
这里需要先理解透。
升级练习题。
1、创建Person类,属性有姓名,年龄,性别。
创建方法printInfo,打印这个人的信息。
2、创建Teacher类,继承Person类,属性增加学院college,专业professional。
重写父类方法printInfo,打印老师的所有信息。创建方法teach,返回信息为‘面向对象设计程序’。
3、创建Student类,继承Person类,属性增加学院college,班级banji。
重写父类方法printInfo,打印学生的所有信息。
创建方法learn,参数为Teache对象(注意是对象,不是Teache类,某某老师,这个某某就是对象。),调用Teache类的字段name和方法teach,接受某某老师教授知识,然后打印”我是***,***老师,***我终于学会了! “
4、创建一个老师的对象,打印其详细信息。
5、创建三个学生的对象,分别打印详细信息。
6、一个学生对象调用方法learn。
7、将三个学生添加至列表中,通过循环将列表的对象打印出来。
先贴一个我自己理解清楚然后改良过的代码。
# coding=utf-8 class Person: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def printInfo(self): print ('我叫%s,年龄%s,性别%s.' % (self.name, self.age, self.sex)) class Teacher(Person): def __init__(self, name, age, sex, college, professional): Person.__init__(self, name, age, sex) self.college = college self.professional = professional # 重写父类方法printInfo def printInfo(self): print ('我叫%s,年龄%s,性别%s.我是来自%s的一名%s讲师' %(self.name, self.age, self.sex, self.college, self.professional)) def teach(self): return '面向对象设计程序' class Student(Person): def __init__(self, name, age, sex, college, banji): Person.__init__(self, name, age, sex) # super(Student, self).__init__(name,age,sex) self.collage = college self.banJi = banji # 重写父类方法printInfo def printInfo(self): print ("我叫%s,年龄%s,性别%s.我是%s%s的学生。" % (self.name, self.age, self.sex, self.collage, self.banJi)) def learn(self,teacher): print('我是%s.%s老师,%s,我终于学会了!' %(self.name, teacher.name, teacher.teach())) TC = Teacher('王芳', '36', '女','软件学院', '1809班') TC.printInfo() stu1 = Student('李雷', '20', '男', '软件学院', '1809班') stu1.printInfo() stu2 = Student('赵四', '19', '男', '软件学院', '1809班') stu2.printInfo() stu3 = Student('韩梅梅', '19', '女', '软件学院', '1809班') stu3.printInfo() stu1.learn(TC) #注意全局和非全局变量的调用。 student = [] student.append(stu1.__dict__) #__dict__类中的属性以字典的形式展示出来 student.append(stu2.__dict__) student.append(stu3.__dict__) print student decoded_data = repr(student).decode('string_escape') #字典和列表中,中文字无法正确显示的解决方法。 print decoded_data print('*'*50) for dict in student: #student列表里有三个字典,需要把字典单独提出来 for key in dict: #从单个字典里提出键。 #print key, dict[key] #打印单个字典里的键值对。 if key == 'name': #替换键的字 print ('姓名:'+dict[key]) if key == 'age': print ('年龄:'+dict[key]) if key == 'sex': print ('性别:'+dict[key]) if key == 'collage': print ('学院:'+dict[key]) if key == 'banJi': print ('班级:'+dict[key]) print('*'*50)
----代码分界线,下列为打印出来的内容-----
我叫王芳,年龄36,性别女.我是来自软件学院的一名1809班讲师
我叫李雷,年龄20,性别男.我是软件学院1809班的学生。
我叫赵四,年龄19,性别男.我是软件学院1809班的学生。
我叫韩梅梅,年龄19,性别女.我是软件学院1809班的学生。
我是李雷.王芳老师,面向对象设计程序,我终于学会了!
[{'collage': '\xe8\xbd\xaf\xe4\xbb\xb6\xe5\xad\xa6\xe9\x99\xa2', 'age': '20', 'name': '\xe6\x9d\x8e\xe9\x9b\xb7', 'banJi': '1809\xe7\x8f\xad', 'sex': '\xe7\x94\xb7'}, {'collage': '\xe8\xbd\xaf\xe4\xbb\xb6\xe5\xad\xa6\xe9\x99\xa2', 'age': '19', 'name': '\xe8\xb5\xb5\xe5\x9b\x9b', 'banJi': '1809\xe7\x8f\xad', 'sex': '\xe7\x94\xb7'}, {'collage': '\xe8\xbd\xaf\xe4\xbb\xb6\xe5\xad\xa6\xe9\x99\xa2', 'age': '19', 'name': '\xe9\x9f\xa9\xe6\xa2\x85\xe6\xa2\x85', 'banJi': '1809\xe7\x8f\xad', 'sex': '\xe5\xa5\xb3'}]
[{'collage': '软件学院', 'age': '20', 'name': '李雷', 'banJi': '1809班', 'sex': '男'}, {'collage': '软件学院', 'age': '19', 'name': '赵四', 'banJi': '1809班', 'sex': '男'}, {'collage': '软件学院', 'age': '19', 'name': '韩梅梅', 'banJi': '1809班', 'sex': '女'}]
**************************************************
学院:软件学院
年龄:20
姓名:李雷
班级:1809班
性别:男
**************************************************
学院:软件学院
年龄:19
姓名:赵四
班级:1809班
性别:男
**************************************************
学院:软件学院
年龄:19
姓名:韩梅梅
班级:1809班
性别:女
**************************************************
下面这个是在最开始写的练习题,我总的感觉很乱,不太顺畅。要注意类的作用域和全局变量区域,先声明再调用,还要注意大小写的区别。
# coding=utf-8 class Person: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def printInfo(self): print ('我叫%s,年龄%s,性别%s.' % (self.name, self.age, self.sex)) class Teacher(Person): def __init__(self, name, age, sex, college, professional): Person.__init__(self, name, age, sex) self.college = college self.professional = professional # 重写父类方法printInfo def printInfo(self): print ('我叫%s,年龄%s,性别%s.我是来自%s的一名%s讲师' %(self.name, self.age, self.sex, self.college, self.professional)) def teach(self): return '面向对象设计程序' class Student(Person): def __init__(self, name, age, sex, college, banji): Person.__init__(self, name, age, sex) # super(Student, self).__init__(name,age,sex) self.collage = college self.banJi = banji # 重写父类方法printInfo def printInfo(self): print ("我叫%s,年龄%s,性别%s.我是%s%s的学生。" % (self.name, self.age, self.sex, self.collage, self.banJi)) def learn(self,teacher): print('我是%s.%s老师,%s,我终于学会了!' %(self.name, teacher.name, teacher.teach())) # 把学生添加至字典 def addStudent(self): content={} content['name'] = self.name content['age'] = self.age content['sex'] = self.sex content['collage'] = self.collage content['banJi'] = self.banJi student.append(content) #这里的student注意S是小写,会加入到下面student的空列表中。 def show_all(self): for dict in student: for key in dict.keys(): if key == 'name': print ('姓名:' + dict[key]) if key == 'age': print ('年龄:' + dict[key]) if key == 'sex': print ('性别:' + dict[key]) if key == 'collage': print ('学院:' + dict[key]) if key == 'banJi': print ('班级:' + dict[key]) print('*'*50) student =[] stu1 = Person('李雷', '20', '男') stu1.printInfo() TC = Teacher('王芳', '36', '女','软件学院', '1809班') TC.printInfo() stu2 = Student('赵四', '19', '男', '软件学院', '1809班') stu2.printInfo() stu3 = Student('韩梅梅', '19', '女', '软件学院', '1809班') stu3.printInfo() stu1 = Student('李雷', '20', '男', '软件学院', '1809班') stu1.printInfo() stu1.learn(TC) #注意全局和非全局变量的调用。 stu1.addStudent() stu2.addStudent() stu3.addStudent() #print student #decoded_data = repr(student).decode('string_escape') #print decoded_data Student.show_all(stu3)
-------代码分界线----
我叫李雷,年龄20,性别男.
我叫王芳,年龄36,性别女.我是来自软件学院的一名1809班讲师
我叫赵四,年龄19,性别男.我是软件学院1809班的学生。
我叫韩梅梅,年龄19,性别女.我是软件学院1809班的学生。
我叫李雷,年龄20,性别男.我是软件学院1809班的学生。
我是李雷.王芳老师,面向对象设计程序,我终于学会了!
学院:软件学院
年龄:20
姓名:李雷
班级:1809班
性别:男
**************************************************
学院:软件学院
年龄:19
姓名:赵四
班级:1809班
性别:男
**************************************************
学院:软件学院
年龄:19
姓名:韩梅梅
班级:1809班
性别:女
**************************************************