第十篇:python基础之面向对象初级

一.面向过程和面向对象

1.1什么是面向过程编程?

核心是”过程“二字,过程指的是解决问题的步骤,即先干什么再干什么
基于该思想编写程序就好比在编写一条流水线,是一种机械式的思维方式

优点:复杂的问题流程化、进而简单化
缺点:可扩展性差

1.2什么是面向对象编程?

核心”对象“二字,对象指的是特征与技能的结合体,
基于该思想编写程序就好比在创造一个世界,你就是这个世界的上帝,是一种
上帝式的思维方式

优点:可扩展性强
缺点:编程的复杂度高于面向过程

二.类与对象

2.1什么是类?

对象是特征与技能的结合体,那类就是一系列对象相同的特征与技能的结合体

2.2现实生活中的类与对象与程序世界中的类与对象的区别 

在现实世界中:一定先有对象,后来随着人类文明的发展总结出的类,对象是具体存在的,而类只是一种抽象概念。在程序中,务必保证:先定义类,后调用类来产生对象。

现实生活中的对象

现实生活中的类与对象:
    对象1:
        特征:
            school="Oldboy"
            name="马冬梅"
            age=18
            sex="female"
        技能:
            学习
            选课

    对象2:
        特征:
            school="Oldboy"
            name="甜蜜蜜"
            age=21
            sex="male"
        技能:
            学习
            选课

    对象3:
        特征:
            school="Oldboy"
            name="原石开"
            age=22
            sex="male"
        技能:
            学习
            选课

现实生活中的老男孩学生类:
     相同的特征
            school="Oldboy"
     相同的技能
            学习
            选课
现实生活中的类与对象
'''
#1、程序中的类
class OldboyStudent:
    # 用变量表示特征
    school="Oldboy"

    # stu1, "马冬梅", 18, 'female'
    def __init__(self,name,age,sex): #self=stu1     name= "马冬梅"   age=18     sex="female"
        # print('==========init run=============>')
        self.name=name # stu1.name = "马冬梅"
        self.age=age  # stu1.age = 18
        self.sex=sex  # stu1.sex = "female"


    #  用函数表示技能
    def learn(self):
        print('is learning...',self)

    def choose(self):
        print('choose course...')

# 在程序中:必须先定义类 - -----》调用类 - -----》对象

# stu1=OldboyStudent()
# stu1.NAME='马冬梅'
# stu1.AGE=18
# stu1.SEX="female"
#
# stu2=OldboyStudent()
# stu2.NAME='甜蜜蜜'
# stu2.AGE=21
# stu2.SEX="male"
#
# stu3=OldboyStudent()
# stu3.NAME='原石开'
# stu3.AGE=22
# stu3.SEX="male"
#
# print(stu1.NAME,stu1.school)
# print(stu2.NAME,stu2.school)
# print(stu3.NAME,stu3.school)
# 上述产生的三个对象都一样了


# 调用类发生哪些事:
#1、首先会产生一个空对象stu1
#2、会自动触发类内部的__init__函数
#3、然后将空对象stu1连同调用类时括号内的参数组成(stu1,"马冬梅",18,'female'),将这四个参数一起传给__init__函数

stu1=OldboyStudent("马冬梅",18,'female')  #OldboyStudent.__init__(stu1,"马冬梅",18,'female')
stu2=OldboyStudent("甜蜜蜜",21,'male') #OldboyStudent.__init__(stu2,"甜蜜蜜",21,'male')
stu3=OldboyStudent("原石开",22,'male')


# print(stu1.name,stu1.age,stu1.sex)
# print(stu2.name,stu2.age,stu2.sex)
# print(stu3.name,stu3.age,stu3.sex)
程序世界中的类与对象

三.类名称空间与对象名称空间及属性查找

school='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
class OldboyStudent:
    school='oldboy'

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    #self=stu1
    def learn(self):
        print('%s is learning' %self.name)

    def choose(self,course):
        print('%s is choosing %s' %(self.name,course))

3.1调用类---》产生类的对象,该对象也可以称为类的一个实例,调用类的过程也称为类的实例化

stu1=OldboyStudent('李三胖',18,'male') #OldboyStudent.__init__(stu1,'李三胖',18,'male')

OldboyStudent.country='CHINA'
print(OldboyStudent.country)

print(OldboyStudent.__dict__)
print(stu1.__dict__)
print(stu1.__dict__['name'])
print(stu1.name)
print(stu1.school)
print(school)

stu2=OldboyStudent('王大炮',28,'male')
print(stu2.__dict__)

3.2类内部定义的变量是给所有对象共享,所有对象指向的都是同一个内存地址

print(id(stu1.school))
print(id(stu2.school))
print(id(OldboyStudent.school))

3.3类内部定义的函数,类可以使用,但类来用的时候就是一个普通函数,普通函数有几个参就传几个参数

print(OldboyStudent.learn)
OldboyStudent.learn(123)

3.4类内部定义的函数,其实是给对象使用的,而且是绑定给对象用,绑定给不同的对象就是不同的绑定方法

print(stu1.learn)
print(stu2.learn)

3.5类的两种属性

1. 类的数据属性是所有对象共享的
2. 类的函数属性是绑定给对象用的

四.绑定方法的特殊之处

绑定方法的特殊之处在于,谁来调用,就会将谁当作第一个参数自动传入
school='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
class OldboyStudent:
    school='oldboy'

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def learn(self):
        print('%s is learning' %self.name)

    def choose(self,course):
        print('%s is choosing %s' %(self.name,course))

stu1=OldboyStudent('李三胖',18,'male')

stu2=OldboyStudent('王大炮',28,'male')

stu1.learn() # OldboyStudent.learn(stu1)
stu2.learn() # OldboyStudent.learn(stu2)

stu1.choose('python')
stu2.choose('linux')
绑定方法的特殊之处相关代码

五.一切皆对象

class OldboyStudent:
    school='oldboy'

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    #self=stu1
    def learn(self):
        print('%s is learning' %self.name)

    def choose(self,course):
        print('%s is choosing %s' %(self.name,course))

stu2=OldboyStudent('王大炮',28,'male')

# print(id(stu2))
# print(type(stu2)) # 类与类型是一个概念
# print(stu2)

l1=[1,2,3] #l1=list([1,2,3])
# print(type(l1))
# l1.append(4)
list.append(l1,4)
print(l1)

l2=['a','b','c']
l2.append('d')
# list.append('d')
print(l2)

print(int)
print(str)
print(dict)
print(tuple)
print(set)
print(OldboyStudent)

六.练习

需求1:记录下功能,自动实例化了几次

class Foo:
    n=0
    def __init__(self):
        Foo.n+=1 # Foo.n=3


obj1=Foo()
obj2=Foo()
obj3=Foo()
print(obj1.__dict__)
print(obj2.__dict__)
print(obj3.__dict__)

print(obj1.n)
print(obj2.n)
print(obj3.n)
自动实例化记录相关代码
class Bar:
    n=1111111111
    def __init__(self,x):
        self.x=x

obj=Bar(111)

# print(obj.__dict__)
# print(obj.n)
obj.y=2
obj.n=3
print(obj.__dict__)
print(obj.n)

obj.x=123
del obj.x
print(obj.x)
对象属性的增删改查相关代码

需求2:对象交互之人狗大战

'''
现实中的对象:
    人1
        特征:
            名字='刘晴政'
            攻击力=60
            生命值=100
        技能:
            咬

    人2
        特征:
            名字='王苗璐'
            攻击力=50
            生命值=100
        技能:
            咬

现实中的人类
    相同的特征
    相同的技能
        咬
'''

'''
现实中的对象:
    狗1
        特征:
            名字='武培其'
            品种="京巴"
            攻击力=80
            生命值=50
        技能:
            咬

    人2
        特征:
            名字='李杰'
            品种="藏獒"
            攻击力=200
            生命值=200
        技能:
            咬

现实中的狗类
    相同的特征
    相同的技能
        咬
'''
class People:
    def __init__(self, name, aggresivity, life_value=100):
        self.name = name
        self.aggresivity = aggresivity
        self.life_value = life_value

    def bite(self, enemy): #self=p1   enemy=d1
        enemy.life_value-=self.aggresivity
        print("""
        人[%s] 咬了一口狗 [%s]
        狗掉血[%s]
        狗还剩血量[%s]
        """ %(self.name,enemy.name,self.aggresivity,enemy.life_value)
        )

class Dog:
    def __init__(self, name, dog_type, aggresivity, life_value):
        self.name = name
        self.dog_type = dog_type
        self.aggresivity = aggresivity
        self.life_value = life_value

    def bite(self, enemy): #self = d1    enemy= p1
        enemy.life_value-=self.aggresivity
        print("""
        狗[%s] 咬了一口人 [%s]
        人掉血[%s]
        人还剩血量[%s]
        """ %(self.name,enemy.name,self.aggresivity,enemy.life_value)
        )
p1 = People('刘清政', 60)
d1=Dog('李杰',"藏獒",200,200)

p1.bite(d1)
d1.bite(p1)
对象交互之人狗大战相关代码

七.继承与派生

详情点击这里

八.组合

9.1解决代码冗余的问题

解决类与类之间代码冗余问题有两种解决方案:1、继承 2、组合
1、继承:描述的是类与类之间,什么是什么的关系

2、组合:描述的是类与类之间的关系,是一种什么有什么关系
一个类产生的对象,该对象拥有一个属性,这个属性的值是来自于另外一个类的对象
class Date:
    def __init__(self,year,mon,day):
        self.year = year
        self.mon = mon
        self.day = day

    def tell_birth(self):
        print('出生年月日<%s-%s-%s>' % (self.year, self.mon, self.day))

class OldboyPeople:
    school = 'oldboy'

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,level,salary):
        super().__init__(name,age,sex)
        self.level=level
        self.salary=salary

    def change_score(self):
        print('teacher %s is changing score' %self.name)

class Oldboystudent(OldboyPeople):
    def __init__(self,name,age,sex,course,):
        super().__init__(name,age,sex,)
        self.course=course

    def choose(self):
        print('student %s choose course' %self.name)


tea1=OldboyTeacher('egon',18,'male',9,3.1)
date_obj=Date(2000,1,1)
# date_obj.tell_birth()

tea1.birth=date_obj
# print(tea1.birth)
# tea1.birth.tell_birth()
# tea1.change_score()

stu1=Oldboystudent('张三',16,'male','linux')
stu1.birth=Date(2002,3,3)
stu1.birth.tell_birth()
组合的相关代码
class OldboyPeople:
    school = 'oldboy'

    def __init__(self, name, age, sex,):
        self.name = name
        self.age = age
        self.sex = sex

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,level,salary):
        super().__init__(name,age,sex)
        self.level=level
        self.salary=salary

        self.courses=[]

    def change_score(self):
        print('teacher %s is changing score' %self.name)

    def tell_course_info(self):
        print(('老师%s 教授的课程信息如下' %self.name).center(50,'='))
        for course_obj in self.courses:
            course_obj.info()


class Oldboystudent(OldboyPeople):
    def __init__(self,name,age,sex):
        super().__init__(name,age,sex,)
        self.courses=[]

    def choose(self):
        print('student %s choose course' %self.name)

    def tell_course_info(self):
        print(('学生%s 学习的课程信息如下' % self.name).center(50, '='))
        for course_obj in self.courses:
            course_obj.info()

class Course:
    def __init__(self,cname,period,price):
        self.cname=cname
        self.period=period
        self.price=price

    def info(self):
        print('课程信息<名字:%s 周期:%s  价钱:%s>' %(self.cname,self.period,self.price))


tea1=OldboyTeacher('egon',18,'male',9,3.1)
stu1=Oldboystudent('张三',16,'male')

python=Course('Python全栈开发','5mons',3000)
linux=Course('Linux高级架构师','5mons',2000)
go=Course('Go开发工程师','3mons',1000)


# # 给老师添加课程
# tea1.courses.append(python)
# tea1.courses.append(linux)

# print(tea1.courses)
# tea1.courses[0].info()
# for course_obj in tea1.courses:
#     course_obj.info()

# tea1.tell_course_info()


# 给学生添加课程
stu1.courses.append(python)
stu1.courses.append(go)
stu1.courses.append(linux)
stu1.tell_course_info()
组合相关小练习

九.多态、多态性、鸭子类型

详情见这里

十二:封装

详情见这里

十三:绑定与非绑定方法

详情见这里

posted @ 2018-12-28 20:54  王苗鲁  阅读(81)  评论(0编辑  收藏  举报