Python学习笔记-面向对象

Posted wangzhiwei10

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习笔记-面向对象相关的知识,希望对你有一定的参考价值。

  一、什么是面向对象的程序设计

1、面向过程的程序设计  

  面向过程:核心是过程二字,过程即解决问题的步骤,就是先干什么,再干什么。基于该思想写程序就好比在设计一条流水线,是一种机械式的思维方式。
  优点:复杂的过程流程化,进而简单化
  缺点:扩展性差

2、面向对象的程序设计

  面向对象:核心是对象二字,对象是特征与技能的结合体。基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是一种“上帝式”的思维方式
  优点:可扩展性强
  缺点:编程复杂度高,容易出现过度设计问题

二、类与对象

  对象是特征和技能的结合体,类就是一系列对象相似的特征与技能的结合体。

  • 现实世界中:一定是现有的一个个具体存在的对象,后总结出的类
  • 在程序中:一定保证先定义类,后产生对象
技术分享图片
    对象1:
        特征:
            学校=清华
            名字=lionel
            性别=男
            年龄=18
        技能:
            学习
            选课

    对象2:
        特征:
            学校=清华
            名字=xiaohong
            性别=女
            年龄=28
        技能:
            学习
            选课

    对象3:
        特征:
            学校=清华
            名字=daming
            性别=男
            年龄=38
        技能:
            学习
            选课
现实世界中站在学校的角度
技术分享图片
程序中的学校学生类:
    清华学生类
        相似的特征
            学校=清华
        相似的技能
            学习
            选课
程序中的学校学生类
技术分享图片
# 类体代码在类的定义阶段就会立刻执行
class Student:
    school=oldboy
    def learn(self):
        print(is learning)
    def choose_course(self):
        print(choose course)
    print(=====run)
print(Student.__dict__)
python中类与对象

三、属性查找

1、类属性:数据属性、函数属性

  • 类的数据属性是所有对象共享的,id都是一样的。
  • 类的函数属性是绑定给对象用的,称为绑定方法,内存地址都不一样。

2、实例属性:数据属性

3、类属性的增删改查

技术分享图片
class Student:
    school=清华
    def learn(self):
        print(is learning)
    def choose_course(self):
        print(choose course)
    print(=====run)

# 查看类属性
print(Student.school) # 数据属性
print(Student.learn) # 函数属性
"""
=====run
清华
<function Student.learn at 0x101a60488>
"""

# 增加类属性
Student.country=China
print(Student.country)
"""
=====run
China
"""

# 修改类属性
Student.school=北大
print(Student.school)
"""
=====run
北大
"""

# 删除类属性
del Student.country
print(Student.country)
类属性的增删改查

4、类与对象练习

技术分享图片
class Student:
    school=oldboy
    def __init__(self,name,age,sex,course):
        self.name=name
        self.age=age
        self.sex=sex
        self.course=course
    def xue_xi():
        print(学习使我快乐)
    def xuan_ke(self):
        print(我叫%s,选择学习%s %(self.name,self.course))

s1=Student(lionel,18,male,python)

print(s1.school)
print(Student.__dict__)
print(s1.__dict__)
Student.xue_xi()
Student.xuan_ke(s1)
s1.xuan_ke()

"""
清华
{‘__module__‘: ‘__main__‘, ‘school‘: ‘清华‘, ‘__init__‘: <function Student.__init__ at 0x101c60488>, ‘xue_xi‘: <function Student.xue_xi at 0x101c60598>, ‘xuan_ke‘: <function Student.xuan_ke at 0x101c60620>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Student‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Student‘ objects>, ‘__doc__‘: None}
{‘name‘: ‘lionel‘, ‘age‘: 18, ‘sex‘: ‘male‘, ‘course‘: ‘python‘}
学习使我快乐
我叫lionel,选择学习python
我叫lionel,选择学习python
"""
练习

四、类的三大特性

1、静态属性:既能访问到类属性也能访问到实例属性

技术分享图片
class Room:
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.length=length
        self.heigh=heigh
    @property # 既能访问到类属性也能访问到实例属性
    def cal_area(self):
        # print(‘%s 住的 %s 总面积是 %s‘ %(self.owner,self.name,self.length*self.width))
        return self.length*self.width

r1=Room(学区房,lionel,100,100,100)
print(r1.cal_area)
静态属性

2、类方法:只能访问到类属性,不能访问到实例属性

技术分享图片
class Room:
    tag=1
    def __init__(self,name,owner,width,length,heigh):
        self.name=name
        self.owner=owner
        self.width=width
        self.length=length
        self.heigh=heigh

    @property # 既能访问到类属性也能访问到实例属性
    def cal_area(self):
        return self.length*self.width

    @classmethod #只能访问到类属性,不能访问到实例属性
    def tell_info(cls,x):
        print(--->,cls.tag,x)
Room.tell_info(10)
"""
---> 1 10
"""
类方法

3、静态方法:既不能访问到类属性,也不能访问到实例属性

技术分享图片
class Room:
    tag = 1
    def __init__(self, name, owner, width, length, heigh):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.heigh = heigh

    @property # 既能访问到类属性也能访问到实例属性
    def cal_area(self):
        return self.length * self.width

    @classmethod # 只能访问到类属性,不能访问到实例属性
    def tell_info(cls, x):
        print(--->, cls.tag, x)

    @staticmethod # 既不能访问到类属性,也不能访问到实例属性
    def student(a,b,c):
        print(%s %s %s正在学习 %(a,b,c))

Room.student(daming,xiaohong,lionel)
r1=Room(学区房,lionel,100,100,100)
r1.student(alex,egon,lionel)
"""
daming xiaohong lionel正在学习
daming xiaohong lionel正在学习
"""
静态方法

  注意:静态方法和类方法虽然是给类准备的,但是如果实例去用,也是可以用的,只不过实例去调用的时候容易让人混淆,不知道你要干啥。

五、组合

什么是组合?

  组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合。

技术分享图片
class School:
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
    def zhao_sheng(self):
        print(%s 正在招生 %self.name)

class Course:
    def __init__(self,name,price,period,school):
        self.name=name
        self.price=price
        self.period=period
        self.school=school
s1=School(oldboy,北京)
s2=School(oldboy,南京)
s3=School(oldboy,上海)

msg="""
1 老男孩 北京校区
2 老男孩 南京校区
3 老男孩 上海校区
"""
while True:
    print(msg)
    menu={
        1:s1,
        2:s2,
        3:s3
    }
    choice=input(选择学校>>: )
    school_obj=menu[choice]
    name=input(课程名>>: )
    price=input(课程费用>>: )
    period=input(课程周期>>: )
    new_course=Course(name,price,period,school_obj)
    print(课程【%s】属于【%s】【%s】学校 %(new_course.name,new_course.school.name,new_course.school.addr))
组合

 





以上是关于Python学习笔记-面向对象的主要内容,如果未能解决你的问题,请参考以下文章

python-学习笔记1-面向对象编程

python学习笔记-面向对象进阶&异常处理

python学习笔记-面向对象进阶&异常处理

Python学习笔记-面向对象进阶封装多态继承

Python学习笔记之 面向对象

python3学习笔记面向对象;过程;类