一.内容回顾

封装

  1.概念 笔记

  2.__名字 在类的外部就不能用了

  3.私有化的 不能被子类继承,也不能在其他任何类中调用

三个装饰器方法(装饰类中的方法)

  1.不被修饰的  普通方法,会使用对象self的属性

  2.@classmethod  类方法,不使用self的属性,用类cls的属性

  3.@staticmethod 静态方法,不用self的属性和类cls的属性

  4.@property  将一个方法伪装成一个属性

    def  函数名

    @函数名.setter

    @函数名.deleter

  1. # from math import pi
  2. # class Circle:
  3. # def __init__(self,r):
  4. # self.r = r
  5. # @property
  6. # def area(self):
  7. # return pi*self.r**2
  8. # @property
  9. # def perimeter(self): # 周长
  10. # return 2*pi*self.r
  11. # @perimeter.setter
  12. # def perimeter(self,新的周长):
  13. # self.r = 新的周长 / 2 / pi

setter修改属性值

  1. # setter装饰的函数名叫什么 perimeter

  1. # 那么在这个函数中绝对不可以对这个函数名同名的属性进行修改
  1. # 程序的逻辑问题
  2. # 1. 不可以对某些计算结果直接赋值
  3. # 2. 一般是通过对计算结果产生影响的属性进行重新赋值
  4. # 比如说对于圆这个例子 : 不能直接修改面积或者周长,应该通过修改半径来带动对应周长和面积的改变
  1. # 反射(不得不用)
  2. # 使用字符串的方式,操作对象的属性(对象属性,类的动态属性(方法))
  3. # 在python中 一切皆对象(类也是对象,对象也是对象,模块也是对象)
  4. # a.b
  5. # a就是一个对象
  6. # b本质上是一个变量名,也可以说是a的一个属性
  7. # 如果b是b 那么就用a.b
  8. # 如果b是'b' 那么就用getattr(a,'b')

二.面向对象的基础
三大特性

  基础的继承

  基础的封装 __私有

两个内置函数:issubclass  isinstance

反射: setattr/delattr  了解

内置方法: 你没有应用场景

__new__

__call__

__str__/__repr__

__len__

__***item__系列

__hash__

__eq__

issubclass(子类,父类),如果真的有继承关系,就返回True

  1. class A(object):pass
  2. class B(A):pass
  3. print(issubclass(B,A))
  1. # isinstance(对象,类)
  2. # class A(object):pass
  3. # a = A()
  4. # print(isinstance(a,A))
  1. # # 继承
  2. # class A(object):pass
  3. # class B(A):pass
  4. # b = B()
  5. # print(isinstance(b,A)) # 检测的对象是不是某个类以及其父类的对象
  6. # print(type(b) is B) # 检测的是对象是不是某一个类的实例
  7. # print(type(b) is A)
  1. 所有的反射 都是用字符串 操作对象的属性
  1. class A:
  2. def __init__(self,name,age):
  3. self.name = name
  4. self.age = age
  5.  
  6. a = A('alex',83)
  7. # hasattr
  8. # print(getattr(a,'name'))#alex
  9. # a.sex = '不详'
  10. # setattr(a,'sex','不详')
  11. # print(a.sex)#不详
  12. del a.age
  13. # delattr(a,'age')
  14. print(a.__dict__)#{'name': 'alex', 'sex': '不详'}
  1.  
  1. # 关于内置方法的名字
  2. # 内置方法 双下方法 魔术方法
  3. # 内置方法的特点
  4. # 一定有某一个语法或者一种写法自动触发这个方法
  1.  
  1. # 重点掌握的
  2. # 哪些写法 触发 对应的内置方法
  3. # 实例化 __new__\__init__ 构造方法(单例模式)\初始化方法
  4. # 对象() __call__
  5. # del 对象 __del__ 析构方法\对象删除之前的收尾工作
  6. # print(对象) __str__ 让一个对象的显示更加清晰
  7. # str(对象)
  8. # '%s'%对象
  9. # repr() __repr__ 是__str__的备胎,并且还和repr(),%r格式化有关系
  10. # '%r'%对象
  11. # len(对象) __len__
  12. # 对象[参数] item系列
  13. # == __eq__
  1. __call__ 对象用call方法可以调用函数__call__里的方法
  1. # __call__
  2. class Student():
  3. def __init__(self,name,age):
  4. self.name = name
  5. self.age = age
  6. def call(self):pass
  7. def __call__(self, *args, **kwargs):
  8. print('调用我啦')
  9. alex = Student('alex',83)
  10. # callable #查看某个变量能否被调用
  11. # callable(变量) #返回True,那么 变量() --> 调用
  12. print(callable(Student))#True
  13. print(callable(alex))#True
  14. # alex()
  15. alex.call()#调用我啦
  1.  
  1. class Dog(object):
  2. def __new__(cls, *args, **kwargs):
  3. pass
  4. dog_obj = object.__new__(cls)#调用父类object__new__内置方法
  5. dog_obj = super().__new__(cls)##调用父类object__new__内置方法,第二种方法
  6. return dog_obj
  7. def __init__(self,name,age):
  8. self.name = name
  9. self.age = age
  10.  
  11. wc = Dog('旺财',2)
  12. print(wc.name)
  1.  
  1. # 一个类 只能实例化一次的方法
  2. class Teacher:
  3. flag = None
  4. def __new__(cls, *args, **kwargs):
  5. if cls.flag is None:
  6. cls.flag = object.__new__(cls) # 这一句话只能走一次
  7. return cls.flag
  8. def __init__(self,name):
  9. self.name = name
  10.  
  11. alex1 = Teacher('alex')
  12. alex2 = Teacher('alex')
  13. yuan = Teacher('yuan')
  14. print(alex2.name)#yuan
  15. print(yuan.name)#yuan
  1. __del__
  1. # 析构方法(了解) 删除
  2. class Teacher:
  3. def __init__(self,name):
  4. self.name = name
  5. def __del__(self):
  6. print('执行我啦')
  7.  
  8. alex = Teacher('ALEX')
  9. del alex
  10. print('hahaha')
  1.  
  1. # del alex # 执行del 对象的时候 触发__del__,在真正的删除alex对象之前,执行的方法__del__
  2. # 如果我们自己不删除alex,那么在程序的执行过程中或者最后,垃圾回收机制会替你执行del alex
  3. # 1.del alex
  4. # 2.执行__del__
  5. # 3.删除alex
  1.  
  1. class File(object):
  2. def __init__(self,file_name):
  3. self.f = open('file_name')
  4. def read(self):
  5. self.f.read(1024)
  6. def __del__(self):# 对象使用的一些操作系统的资源的归还工作/收尾工作
  7. self.f.close()
  1. __str__
  1. class Course:
  2. def __init__(self,name,price,period,teacher):
  3. self.name = name
  4. self.price = price
  5. self.period = period
  6. self.teacher = teacher
  7. def __str__(self): # 必须有返回值,必须返回一个str类型
  8. return '%s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
  9. course_lst = []
  10. python = Course('python',19800,'6 months','baoyuan')
  11. linux = Course('linux',16800,'5 months','oldboy')
  12. print(python)
  13. print(str(python))
  14. print('课程展示 : %s'%python)
  1.  
  1. class Course:
  2. def __init__(self,name,price,period,teacher):
  3. self.name = name
  4. self.price = price
  5. self.period = period
  6. self.teacher = teacher
  7. def __str__(self): # 必须有返回值,必须返回一个str类型
  8. return '%s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
  9. course_lst = []
  10. python = Course('python',19800,'6 months','baoyuan')
  11. linux = Course('linux',16800,'5 months','oldboy')
  12. print(python)
  13. print(str(python))
  14. print('课程展示 : %s'%python)
  1.  
  1. # list.__str__()
  2. l = [1,2,3,4] # 对象 列表的对象
  3. print(l)
  4. print('[%s,%s,%s]'%(l[0],l[1],l[2]))
  1. __repr__ str方法的备胎(有str调用str,没有strrepr)
  1. class Course:
  2. def __init__(self,name,price,period,teacher):
  3. self.name = name
  4. self.price = price
  5. self.period = period
  6. self.teacher = teacher
  7. def __repr__(self): # 必须有返回值,必须返回一个str类型
  8. return 'repr --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
  9. def __str__(self): # 必须有返回值,必须返回一个str类型
  10. return 'str --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
  11.  
  12. python = Course('python',19800,'6 months','baoyuan')
  13. linux = Course('linux',16800,'5 months','oldboy')
  14. print(python)
  15. print(linux)
  1.  
  1. class Course:
  2. def __init__(self,name,price,period,teacher):
  3. self.name = name
  4. self.price = price
  5. self.period = period
  6. self.teacher = teacher
  7. def __repr__(self): # 必须有返回值,必须返回一个str类型
  8. return 'repr --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
  9. def __str__(self): # 必须有返回值,必须返回一个str类型
  10. return 'str --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
  11. python = Course('python',19800,'6 months','baoyuan')
  12. linux = Course('linux',16800,'5 months','oldboy')
  13. print('%r'%python)#repr --> : python,19800,6 months,baoyuan
  14. print('%s'%python)#str --> : python,19800,6 months,baoyuan
  15. print(str(python))#str --> : python,19800,6 months,baoyuan
  16. print(repr(python))#repr --> : python,19800,6 months,baoyuan
  1.  
  1. # 流畅的python : repr和str 如果只能写一个的 写repr
  1.  
  1. class Course:
  2. def __init__(self,name,price,period,teacher):
  3. self.name = name
  4. self.price = price
  5. self.period = period
  6. self.teacher = teacher
  7. def __len__(self):
  8. return len(self.__dict__)
  9. def __getitem__(self,item):
  10. return self.__dict__[item]
  11. def __setitem__(self, key, value):
  12. self.__dict__[key] = value
  13. def __delitem__(self, key):
  14. self.__dict__.pop(key)
  15. python = Course('python',19800,'6 months','baoyuan')
  16. print(len(python))
  17. print(python.name)
  18. print(python['name']) # ==> 调用getitem
  19. print(python['price']) # ==> 调用getitem
  20. python['name'] = 'python2.0'
  21. print(python.name)
  22. # del python.name#与下一句功能一样
  23. del python['name']
  24. print(python.__dict__)#{'price': 19800, 'period': '6 months', 'teacher': 'baoyuan'}
  25. # 有一些内置的函数/模块 要想能正确的使用它们 那么必须按照它规定的语法来实现
  1. __len__ 测量对象长度
  1. class Ruler:
  2. def __init__(self,price,length,jingdu):
  3. self.length = length
  4. self.price = price
  5. self.jingdu = jingdu
  6. def __len__(self):
  7. return self.length
  8. stu_ruler = Ruler(2.5,15,0.1)
  9. print(len(stu_ruler))#15
  1. __eq__ s1==s2 等于 s1.__eq__(s2)
  1. class Student():
  2. def __init__(self,name,age):
  3. self.name = name
  4. self.age = age
  5. def __eq__(self, other):
  6. if self.name == other.name and self.age == other.age:
  7. return True
  8. return False
  9.  
  10. s1 = Student('贾卫东',20)
  11. s2 = Student('贾卫东',20)
  12. print(s1 == s2) # s1.__eq__(s2)#True
  13. print(s1 is s2) # s1.__eq__(s2)#False
  1. #够通过这个字符串 --> 程序中的变量名(类名\函数名\变量名\方法名\对象名)
  1. class Manager:pass
  2. class Student:pass
  3. class Teacher:pass
  4. identify = 'Student'
  5. print(eval(identify)())#<__main__.Student object at 0x00000000025657B8>

反射 hasattr getattr

  1. class Person:
  2. role = '人类'
  3. Country = '中国'
  4.  
  5. attr = input('>>>') # role 人类
  6. # # Country 中国
  7. print(getattr(Person,'role'))
  8. print(getattr(Person,'Country'))
  9. if hasattr(Person,attr):
  10. print(getattr(Person,attr))
  11.  
  12. if attr == 'role':
  13. print(Person.role)
  14. elif attr == 'Country':
  15. print(Person.Country)
  1. class Person:
  2. role = '人类'
  3. @staticmethod
  4. def show_courses():
  5. print('所有课程')
  1. # 反射类中的方法
  2. # class Person:
  3. # role = '人类'
  4. # @staticmethod
  5. # def show_courses():
  6. # print('所有课程')
  7. # Person.role == getattr(Person,'role')
  8. # Person.show_courses() == getattr(Person,'show_courses')()
  9. # ret = getattr(Person,'show_courses')
  10. # ret()
  1. # 有一个类,有很多静态属性,也有很多静态方法/类方法
  2. # 用户输入input任意的属性名或者方法名,
  3. # 如果是属性 直接打印 - 用到一个内置函数#getattr(Person,'role')
  4. # 如果是方法 直接调用 - 用到一个内置函数#getattr(Person,'show_courses')
  5. # 要求程序不报错
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  
  1.  

day31 Pyhton 面向对象的基础 三大特性的更多相关文章

  1. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

  2. PHP其它常用函数;<<<面向对象(OPP)的三大特性:封装、继承、加态:>>> <----面试题 ;构造方法、析构方法,魔术方法、set、get方法;静态;抽象类;接口

    PHP其它常用函数:     赋值:$r->name = "元素";      取值: echo $r->name;  count()   计算数组中的元素数目或对象中 ...

  3. Java面向对象概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...

  4. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  5. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  6. 前端学PHP之面向对象系列第三篇——三大特性

    × 目录 [1]封装 [2]继承[3]多态 前面的话 php面向对象编程的三大特性是封装性.继承性和多态性.本文将介绍php的这三大特性 封装 封装就是把对象中的成员属性和成员方法加上访问修饰符( p ...

  7. java基础(三)-----java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  8. java基础(一)-----java的三大特性之封装

    面向对象编程有三大特性:封装.继承.多态.本文将介绍java的三大特性之封装 封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成 ...

  9. 3.java面向对象编程三大特性之多态

    面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对类的外部而言它的内部实现细节是隐藏的,暴露给外界的只是它的实现方法. ...

随机推荐

  1. Git 实用操作:撤销 Commit 提交

    有的时候,改完代码提交 commit 后发现写得实在太烂了,连自己的都看不下去,与其修改它还不如丢弃重写.怎么操作呢? 使用 reset 撤销 如果是最近提交的 commit 要丢弃重写可以用 res ...

  2. lua数据结构之table的内部实现

    一.table结构 1.Table结构体 首先了解一下table结构的组成结构,table是存放在GCObject里的.结构如下:   typedef struct Table {   CommonH ...

  3. python之ddt模块使用

    一.DDT(数据驱动)简介 Data-Driven Tests(DDT)即数据驱动测试,可以实现不同数据运行同一个测试用例(通过数据的不同来驱动测试结果的不同). ddt本质其实就是装饰器,一组数据一 ...

  4. dict字典,以及字典的一些基本应用

    dict表示方法: dict={}或d=dict() 1.字典的增:d['元素名']='元素值'.或d.setdefault('key','value') 2.字典的删:d.pop(key).或del ...

  5. C、算法、操作系统杂记《malloc 0大小是什么行为》

    linux手册上的说明 If size is 0, then malloc() returns either NULL, or a unique pointer value that can late ...

  6. 突然挂了!Redis缓存都在内存中,这下完了!

    我是Redis,一个叫Antirez的男人把我带到了这个世界上. “快醒醒!快醒醒!”,隐隐约约,我听到有人在叫我. 慢慢睁开眼睛,原来旁边是MySQL大哥. “我怎么睡着了?” “嗨,你刚才是不是出 ...

  7. Docker之简单操作

    安装完Docker后,我们就可以与Docker进行交互来创建和管理容器等操作. 容器生命周期管理: 创建一个新的容器并运行一个命令 docker run [OPTIONS] IMAGE [COMMAN ...

  8. 必须了解的mysql三大日志-binlog、redo log和undo log

    日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志.查询日志.慢查询日志.事务日志.二进制日志几大类.作为开发,我们重点需要关注的是二进制日志( ...

  9. java注解(1)

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.注解是Java SE5中引入的重要的语言 ...

  10. Redis5设计与源码分析读后感(一)认识Redis

    一.初识redis 定义 Redis是一个开源的Key-Value数据库,通常被称为数据结构服务器,其值可以是多种常见的数据格式,且读写性能极高,且所有操作都是原子性的. 高性能的主要原因 1.基于内 ...