面向对象知识
# 面向对象 # 类的定义 ‘‘‘ 基本形式: class ClassName(object): Statement 1.class定义类的关键字 2.ClassName类名,类名的每个单词的首字母大写。 3.object是父类名,object是一切类的基类。在python3中如果继承类是基类可以省略不写。 ‘‘‘ # 类的初始化 # __init__ ‘‘‘ 定义类时,这种方法可以使类对象实例按某种特定的模式生产出来。 后面的参数中第一个参数我们约定俗成的为self参数名, self代表的是在类实例化后这个实例对象本身。 初始化函数除了有self这个参数表示实例对象本身之外, 其他的参数的定义也遵循函数的必备参数和默认参数一样的原则, 必备参数就是在实例化是一定要传入的参数, 默认参数就是在定义时可以给这个参数一个初始值。 ‘‘‘ # 类的实例化 ‘‘‘ 基本形式:实例对象名 = 类名(参数) 在实例化的过程中,self代表的就是这个实例对象自己。 实例化时会把类名后面接的参数传进去赋值给实例, 这样传进去的参数就成为了这个实例对象的属性。 实例化的过程遵循函数调用的原则。 在实例化时也必须个数和顺序与定义时相同(使用关键字参数可以改变传参的顺序)。 当初始化函数定义时使用了默认参数时,在实例化时默认参数可以不传参这时 这个实例对象就会使用默认的属性,如果传了参数进去则会改变这参数值, 使实例化对象的属性就为你传进来的这个参数。 isinstance(实例名,类名) 判断一个实例是不是这个类的实例。 ‘‘‘ # 类的定义 class Fruits: fruits = ‘xxxxxx‘ # 类属性 def __init__(self,name,color,weight=90): self.name = name self.color = color self.weight = weight self.fruits = ‘yyyyy‘ # 实例属性 def show(self): print(‘我的重量是%s‘% self.color) class Apple(Fruits): def __init__(self,color,weight,shape): Fruits.__init__(self,‘apple‘,color,weight) # 调用父类的初始化函数 self.shape = shape def eat(self): print(‘被吃掉了。。。。‘) ap1 = Apple(‘red‘,100,‘圆的‘) # 类的实例化 fr1 = Fruits(‘apple‘,‘red‘) fr2 = Fruits(‘banana‘,‘yellow‘) fr3 = Fruits(‘apple‘,‘green‘,100) # 类和实例属性 ‘‘‘ 类属性 .类属性是可以直接通过“类名.属性名”来访问和修改。 .类属性是这个类的所有实例对象所共有的属性, 任意一个实例对象都可以访问并修改这个属性(私有隐藏除外)。 .对类属性的修改,遵循基本数据类型的特性:列表可以直接修改,字符串不可以, 所以当类属性是一个列表时,通过任意一个实例对象对其进行修改。 但字符串类型的类属性不能通过实例对象对其进行修改。 实例属性 .在属性前面加了self标识的属性为实例的属性。 .在定义的时候用的self加属性名字的形式,在查看实例的属性时 就是通过实例的名称+‘.’+属性名来访问实例属性。 方法属性 .定义属性方法的内容是函数,函数的第一个参数是self,代表实例本身。 一些说明: .数据属性会覆盖同名的方法属性。减少冲突,可以方法使用动词,数据属性使用名词。 .数据属性可以被方法引用。 .一般,方法第一个参数被命名为self,,这仅仅是一个约定, self没有特殊含义,程序员遵循这个约定。 .查看类中的属性和实例属性可以调用__dict__方法返回属性组成的字典。 ‘‘‘ # 私有变量和类本地变量。 ‘‘‘ 以一个下划线开头的命名(无论是函数,方法或数据成员), 都会被隐藏起来。但直接将命名完整的写下还是一样可以访问到。 单下划线只是隐藏了属性,但还是可以从外部访问和修改。 以两个下划线开头的命名,一样会被隐藏,只能在内部访问和修改, 不能在外部访问,因为它变成了“_类名__属性”的形式。 在外部只能通过这种形式才能访问和修改。 双下划线开头的属性就变成了私有变量,即使能改也不要在外部外部修改了。 私有变量的作用就是确保外部代码不能随意修改对象内部的状态。 ‘‘‘ # 数据封装: ‘‘‘ .在类里面数据属性和行为用函数的形式封装起来, 访问时直接调用,不需知道类里面具体的实现方法。 ‘‘‘ # 继承: ‘‘‘ .在定义类时,可以从已有的类继承, 被继承的类称为基类,新定义的类称为派生类。 .在类中找不到调用的属性时就搜索基类, 如果基类是从别的类派生而来,这个规则会递归的应用上去。 反过来不行。 .如果派生类中的属性与基类属性重名,那么派生类的属性会覆盖掉基类的属性。 包括初始化函数。 .派生类在初始化函数中需要继承和修改初始化过程, 使用’类名+__init__(arg)’来实现继承和私有特性,也可以使用super()函数。 issubclass(类名1,类名2) 判断类1是否继承了类2 ‘‘‘ # 多态: ‘‘‘ .多态是基于继承的一个好处。 .当派生类重写了基类的方法时就实现了多态性。 ‘‘‘:
代码示例:
1 ‘‘‘ 2 一、根据课堂上讲的内容写个人的类。 3 要求: 4 1. 属性包含姓名,性别,年龄。 5 2.方法可以自己随便写。 6 7 ‘‘‘ 8 class Human: 9 def __init__(self,name,sex,age,hobby,reading): 10 self.name = name 11 self.sex = sex 12 self.age = age 13 self.hobby = hobby 14 self.reading = reading 15 def sleep(self): 16 print(‘%s每天晚上在10:00前必须睡觉‘ % self.name) 17 18 def active(self): 19 print(‘%s喜欢%s,不喜欢%s‘ %(self.name,self.hobby,self.reading)) 20 21 print(‘####################第一题代码输出#########################‘) 22 person1 = Human(‘小明‘,‘男‘,‘21‘,‘swimming‘,‘story‘) 23 person1.sleep() 24 person1.active() 25 26 person2 = Human(‘吉米‘,‘女‘,‘20‘,‘basketball‘,‘picutre‘) 27 person2.sleep() 28 person2.active() 29 print(‘\n‘) 30 31 ‘‘‘ 32 二、写一个学生的类,学生的类继承了人的类。 33 要求: 34 1.在继承人的属性的基础上增加成绩这一属性。 35 2.把之前分数等级测试的函数写到这个类里,作为这个类的一种方法。 36 提示:把input和循环语句都删掉,只留下if判断。 37 ‘‘‘ 38 39 class Student(Human): 40 def __init__(self,score): 41 self.score = score 42 43 def info(self): 44 print(‘my name is %s,I am %s, and %s years,I like %s‘ %(self.name,self.sex,self.age,self.hobby)) 45 def test(self): 46 if type(self.score) == int or type(self.score)==float: 47 self.score = float(self.score) 48 if 90 <= self.score <=100: 49 print(‘成绩为:A‘) 50 elif 80<=self.score<90: 51 print(‘成绩为:B‘) 52 elif 60<=self.score<80: 53 print(‘成绩为:C‘) 54 elif 0<=self.score<60: 55 print(‘成绩为:D‘) 56 else: 57 print(‘输入有误!‘) 58 else: 59 print(‘输入有误,请重新输入‘) 60 61 print(‘####################第二题代码输出#########################‘) 62 student1=Student(8.1) 63 student1.test() 64 student2=Student(80.5) 65 student2.test() 66 student3=Student(91) 67 student3.test() 68 69 student4= Student(98) 70 student4.name = ‘alex‘ 71 student4.sex=‘男‘ 72 student4.age=25 73 student4.hobby=‘walking‘ 74 student4.info()
时间: 2024-10-13 07:21:07