一、什么事面向对象,以及面向对象的优点?

面向过程优缺点:

我们知道面向过程是流水线式的编程,过程就是解决问题的步骤,把大的问题化解成小的模块

面向过程优点: 极大的降低了程序的复杂度

面向过程缺点: 牵一发而动全身, 所以完成一个模块很少改动,否则改动的地方比较多

面向对象优缺点:

面向对象编程的核心是对象,由属性和函数构成

面向对象优点: 解决程序的扩展性,对某个类的修改能反映到整个体系中

类的语法结构:

class 类名:

类体

例子:

class People:

language = ‘Chinese‘

def func(self): #self把对象自身传进去

pass

p1 = People

p2 = People

print(p1.language)

print(p2.language)

p1.language = ‘english‘

print(p1.language) #输出english

print(p2.language) #输出english

注: 所有对象共用类的属性,所以p2也输出english

初始化类__init__

例子:

class Garen:

camp=‘Demacia‘

def __init__(self,nickname, aggressivity=58,life_value=456):

self.nickname = nickname

self.aggressivity = aggressivity

self.life_value = life_value

def attack(self,enemy):

enemy.life_value -= self.aggressivity

hero = Garen(‘garen‘, 100, 600) #加括号初始化类对象

print(isinstance(hero, Garen)) #isinstance判断hero是否是类Garen的实例,是则返回True,否则返回False

print(Garen.__name__) #类的名称

print(Garen.__doc__) #类的文档字符串

print(Garen.__base__) #类的第一个父类

print(Garen.__bases__) #类的所有父类构成的元组

print(Garen.__dict__) #类的字典属性

print(Garen.__module__) #类定义所在的模块

print(Garen.__class__) #实例对应的类

将函数绑定到对象上叫做对象的方法,并且会把自身传递给函数作为第一个参数

对象的交互:

class Riven:

camp = ‘Noxus‘

def __init__(self, nickname, aggressivity=54,life_value=300):

self.nickname = nickname

self.aggressivity = aggressivity

self.life_value = life_value

def attack(self,enemy):

enemy.life_value -= self.aggressivity

r1 = Riven(‘瑞问问‘)

print(hero.life_value)

r1.attack(hero)

print(hero.life_value)

print(id(r1.attack)) #id打印函数位置

print(id(Riven.attack))

类有两种属性:数据属性和函数属性,数据属性共享给所有对象。

方法是绑定到所有对象上的,并且对象会传递给函数

创建对象就是创建了一个命名空间,对象会先找自己的命名空间,再找类的命名空间

二、继承

继承是一种创建新类的方式

继承的好处,减少代码冗余,

子类覆盖父类的方法叫做派生

例子:

class ParentClass1:

pass

class ParentClass2:

pass

class SubClass1(ParentClass1):

pass

class SubClass2(ParentClass1,ParentClass2):

pass

print(SubClass1.__bases__) #打印父类

print(SubClass2.__bases__) #打印父类

继承关系如图:

F->A->E-B->D->C

F->D->B-E->C->H->A派生类

例子:

class Animal:

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

self.name = name

self.age = age

self.sex = sex

def eat(self):

print(‘eating‘)

def talk(self):

print(‘%s 正在叫‘ %self.name)

class People(Animal):

def __init__(self,name,age,sex,education):

Animal.__init__(self,name,age,sex)

self.education = education

def talk(self):

Animal.talk(self)

print(‘%s say hello‘ %self.name)

class Pig(Animal):

pass

class Dog(Animal):

pass

peo1 = People(‘hyh‘,20,‘male‘,‘小学毕业‘)

pig1 = Pig(‘zhangsan‘, 16, ‘male‘)

dog1 = Dog(‘lisi‘, 16, ‘female‘)

peo1.talk()

pig1.talk()

dog1.talk()

print(isinstance(peo1, People)) #判断peo1是否是People类,返回True或False

print(isinstance(pig1, Pig)) #继承反映的什么是什么的关系

print(isinstance(dog1, Dog))

通过__dict__获取属性

class Sub:

def __init__(self):

self.bar = 123

def bar(self):

print(‘Sub.bar‘)

s = Sub()

print(s.__dict__)

print(s.__dict__[‘bar‘])

组合: 在一个类中,以另外一个类的对象作为数据属性,称为类的组合,组合反映的是什么有什么的关系,

例子:

class People:

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

self.name=name

self.age=age

self.sex=sex

class Date:

def __init__(self,year,mon,day):

self.year = year

self.mon = mon

self.day = day

def tell(self):

print(‘%s-%s-%s‘ %(self.year,self.mon,self.day))

class Teacher(People):

def __init__(self,name,age,sex,salary,year,mon,day):

self.name = name

self.age = age

self.sex = sex

self.salary = salary

self.birth = Date(year,mon,day)

class Student(People):

def __init__(self,name,age,sex,year,mon,day):

self.name=name

self.age=age

self.sex=sex

self.birth=Date(year,mon,day)

t=Teacher(‘egon‘,18,‘male‘,3000,1995,12,31)

t.birth.tell()

定义类模拟接口

例子:

class File:

def read(self):

raise TypeError(‘类型错误‘)

def write(self):

raise TypeError(‘类型错误‘)

class Txt(File):

def read(self):

print(‘文本数据的读取方法‘)

def write(self):

print(‘文本数据的读取方法‘)

class Sata(File):

def read(self):

print(‘硬盘数据的读取方法‘)

def wirte(self):

print(‘硬盘数据的读取方法‘)

class Process(File):

def read(self):

print(‘进程数据的读取方法‘)

def write(self):

print(‘进程数据的读取方法‘)

p = Process()

p.read()

t = Txt()

d = Sata()

print(isinstance(p, Process))

print(isinstance(t, Txt))

print(isinstance(d, Sata))

注: File类定义功能函数,Txt,Sata,Process分别定义实现函数的方法

调用父类用super方法

例子:

class Foo1:

def test(self):

print("from foo1.test")

class Foo2:

def test(self):

print(‘from foo2.test‘)

class Bar(Foo1,Foo2):

def test(self):

super().test()

print(‘Bar‘)

b = Bar()

b.test()三、封装封装:主要为了保护数据的隐私,而把数据隐藏起来,只能通过接口去访问

类中通过__双下划线来隐藏数据属性和函数属性,含有__x的属性都会变成_类名__x的形式:Foo:

__x = __test(): ()

(Foo.)封装实例:

class People:

__country = ‘China‘

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

self.__name = name

#self._People__name = name

self.__age = age

self.__sex = sex

def tell_info(self):

print(‘人的名字是:%s, 人的年龄是: %s, 人的性别是: %s‘ %(self.__name, self.__age, self.__sex))

p = People(‘alex‘, 29, ‘male‘)

print(p.__dict__)

p.tell_info()

注: 封装只在定义时检查语法

p.__x = 1

print(p.__x) #打印1

修改属性接口

class People:

def __init__(self,name,age):

self.__name = name

self.__age = age

def tell_info(self):

print(‘人的名字是: %s, 人的年龄是: %s‘ %(self.__name, self.__age))

def set_info(self,x, y):

if not isinstance(x, str):

raise TypeError(‘名字必须是字符串‘)

if not isinstance(y, int):

raise TypeError(‘年龄必须是整数‘)

self.__name = x

self.__age = y

p = People(‘alex‘, 20)

p.tell_info()

p.set_info(‘hyh‘, 18)

p.tell_info()

四、类装饰器

原文:http://haoyonghui.blog.51cto.com/4278020/1934677

python学习面向对象_python学习之面向对象学习相关推荐

  1. python登录面向对象_python基础之面向对象

    面向对象编程 面向过程编程:根据业务逻辑从上到下写代码,主要突出在流程上 函数式编程:将某些功能封装在函数里,日后不用重复编写,仅调用函数即可 面向对象编程:对函数进行分类和封装,让开发"更 ...

  2. python工程技巧_python 19个值得学习的编程技巧

    Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀 ...

  3. python随机数生成验证码_Python随机数random模块学习,并实现生成6位验证码

    一.前言 学习python随机数random模块的使用 ,并使用模块中的函数,实现6位验证码生成 二.random模块 1.random.random() 返回0-1直接的随机数,类型为float & ...

  4. python定时器 循环_python从写定时器学习Thread

    python从写定时器学习Thread python 如何写一个定时器,循环定时做某一操作呢? Timer 对象 from threading import Timer def hello(): pr ...

  5. python爬虫文件格式_Python网络爬虫数据格式学习(转换headers、表单和urlencode数据为字典格式)...

    最近在学习爬虫时经常要复制浏览器的headers和表单数据到Python进行操作,但是复制过来的IE的数据格式是对用制表符('\t')进行分隔,而Chrome复制过来的是用冒号(':')分隔,不能够直 ...

  6. 学习python时间安排_Python时间和日期学习

    1 #coding=utf-8 2 __author__ = 'Administrator' 3 4 5 #日期和时间模块学习 6 """ 7 Python程序能用很多方 ...

  7. python numpy数据类型_Python之numpy数组学习(一)

    原标题:Python之numpy数组学习(一) 我回来了. 前言 前面已经安装并学习了Python中的科学计算库,今天主要学习下numpy数组. Numpy数组对象 Numpy中的多维数组称为ndar ...

  8. python语言训练教程_PYTHON零基础快乐学习之旅(K12实战训练)

    本书在讲解Python编程语言语法概念的同时融入了相关的科学知识.随着人工智能技术的飞 速发展,编程教育越来越重要.编程的核心是算法和逻辑,是通往未来的语言.近期,国务院发 布<新一代看人工智能 ...

  9. python模拟手写_Python实现简单可学习的手写体识别

    ''' LearningUI类 功能:生成UI界面,以及定义事件处理方法 作者:PyLearn 博客: http://www.cnblogs.com/PyLearn/ 最后修改日期: 2017/10/ ...

  10. python缩进教学_Python缩进和选择学习

    缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这是C,不是Python! ...

最新文章

  1. mysql 数据表 时间自动_MySQL数据库时间设置自动添加时间和自动更新时间
  2. 洪小文:以科学的方式赤裸裸地剖析AI(二)|从寒冬到复兴
  3. 市场规模占全国4成,广东物联网市场发展强劲
  4. Java线程之守护线程(Daemon) .
  5. MySQL基础总结(三)
  6. 超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享...
  7. oracle 根据分隔符提取,oracle自定义函数按照某个分隔符拆分字符串
  8. 钉钉总裁不穷首谈产品观:To B产品用户不只是CEO
  9. 适合本科生的AI比赛目录
  10. str_pos php,关于php中str_replace替换漏洞的分析
  11. 有了net send,谁还用IM?
  12. ASTC 自适应可伸缩纹理压缩
  13. ***技巧总结(zz)
  14. 《物联网技术》课程笔记——第一章 物联网概述
  15. linux 命令:du 详解
  16. C++入门经典(第三版Ivor Horton著 ) 第一章习题答案
  17. C++ Opencv 实现Canny算法
  18. 如何判断两个ip是否属于同一子网;如何确定子网掩码,让300台服务器处于同一网段
  19. 【python】语法
  20. instagram广告的展现形式有哪些?instagram广告投放全球代理商

热门文章

  1. 完成users中的models
  2. 哈希表的C实现(三)---传说中的暴雪版
  3. SQL语句行列转换两种方法 case ...when 和pivot函数应用
  4. li在ie6 、ie7里莫名其妙的出现几px的margin
  5. Validation of ViewState Mac failed exception
  6. php 这样写日志 sleep你会了吗?
  7. 数据中心服务器机架是什么?
  8. 光纤与光缆有什么区别?—Vecloud微云
  9. MySQL事务效率测试
  10. [HNOI2016]最小公倍数