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))

组合

原文地址:https://www.cnblogs.com/wangzhiwei10/p/8976224.html

时间: 2024-09-29 04:24:52

Python学习笔记-面向对象的相关文章

Python 学习笔记 - 面向对象(类成员)

上一篇学习了Python面向对象的3大特性,封装,继承和多态,这一篇继续学习类成员,包括字段,方法,属性以及他们的修饰符. 1.字段 字段分为静态字段和普通字段.静态字段属于类,而普通字段属于对象,因此静态字段在内存中只保存一份,而普通字段在每个对象中都保存了一份.定义的时候静态字段定义在类的范围里面,而普通字段定义在方法里面. 例如: >>> class Foo:     # 字段(静态字段)     CC = 123     def __init__(self):         #

Python 学习笔记 - 面向对象(基础)

之前学习的编程方式都是通过面向过程来实现的,对于一些重用的代码,进一步的使用了函数,增强了代码的可读性和重用性.Python同时还支持面向对象的编程. 面向对象有三大特性: 封装 继承 多态 首先来看看封装.封装包括两点,把内容封装到某个地方:调用封装的内容 例1: class c1:     def __init__(self,name,obj):         self.name = name         self.obj = obj class c2:     def __init_

Python学习笔记——面向对象编程

接下来学习面向对象编程,基础的就不记录了,只记录一些Python特有的或者高级的特性. http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318645694388f1f10473d7f416e9291616be8367ab5000 1. 类的定义 定义类使用class关键字,后面紧跟类名(首字母大写),接着是从哪个类继承下来的(所有类最终会继承object). 通过类名加参

python学习笔记--面向对象的编程和类

一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模型.一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法. 对象:object对象,也就是指模型造出来的具体的东西.一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每

Python学习笔记-面向对象进阶(二)

一.反射 1.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省). 2.Python面向对象中的反射 通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 3.四个可以实现自省的函数 (1)hasattr(object,name),判断object中有没有一个name字符串对应的方法或属性,检测是否含有某属性. class BlackMedium: feture='Ugly' def _

Python 学习笔记 - 面向对象(特殊成员)

下面是类的特殊成员,当我们执行一些特定操作时候,会自动调用这些特殊的方法 1. __doc__ 表示类的描述信息 >>> class Foo:     """ 描述类信息,这是用于看片的神奇 """     def func(self):         pass print (Foo.__doc__) #输出:类的描述信息 -------------  描述类信息,这是用于看片的神奇 2. __module__ 和  __cl

Python 学习笔记 - 面向对象(其他)

这是面向对象的最后一个部分. 首先看两个函数. 1.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 2.issubclass(sub, super) 检查sub类是否是 super 类的派生类 class Bar:     pass class Foo(Bar):     pass obj = Foo() # obj,Bar(obj类型和obj类型的父类)的实例 ret = isinstance(obj, Bar) print(ret) ret = issubc

Python学习笔记——面向对象基础

1.类和实例 1.1类的定义 类的定义使用class关键字,其后紧跟类名(通常大写开头),紧接着是(object),object是该类继承的类名,没有就继承object类. 实例化时就是类名+(),有参数需要传入参数. class Student(object): pass bart = Student() 类的属性定义在_init_方法中(相当于java的构造方法),该方法的第一个参数永远是self,在实例化时必须传入相应的参数(除self外) class Student(object): d

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

一.初识继承 1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类.子类会"遗传"父类的属性,从而解决代码重用问题. # python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1