首页 > 代码库 > 面向对象编程(一)

面向对象编程(一)

面向对象知识

# 面向对象
# 类的定义
‘‘‘
基本形式:
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()

 

面向对象编程(一)