day31 Pyhton 面向对象的基础 三大特性
一.内容回顾
封装
1.概念 笔记
2.__名字 在类的外部就不能用了
3.私有化的 不能被子类继承,也不能在其他任何类中调用
三个装饰器方法(装饰类中的方法)
1.不被修饰的 普通方法,会使用对象self的属性
2.@classmethod 类方法,不使用self的属性,用类cls的属性
3.@staticmethod 静态方法,不用self的属性和类cls的属性
4.@property 将一个方法伪装成一个属性
def 函数名
@函数名.setter
@函数名.deleter
- # from math import pi
- # class Circle:
- # def __init__(self,r):
- # self.r = r
- # @property
- # def area(self):
- # return pi*self.r**2
- # @property
- # def perimeter(self): # 周长
- # return 2*pi*self.r
- # @perimeter.setter
- # def perimeter(self,新的周长):
- # self.r = 新的周长 / 2 / pi
setter修改属性值
- # setter装饰的函数名叫什么 perimeter
# 那么在这个函数中绝对不可以对这个函数名同名的属性进行修改
- # 程序的逻辑问题
- # 1. 不可以对某些计算结果直接赋值
- # 2. 一般是通过对计算结果产生影响的属性进行重新赋值
- # 比如说对于圆这个例子 : 不能直接修改面积或者周长,应该通过修改半径来带动对应周长和面积的改变
- # 反射(不得不用)
- # 使用字符串的方式,操作对象的属性(对象属性,类的动态属性(方法))
- # 在python中 一切皆对象(类也是对象,对象也是对象,模块也是对象)
- # a.b
- # a就是一个对象
- # b本质上是一个变量名,也可以说是a的一个属性
- # 如果b是b 那么就用a.b
- # 如果b是'b' 那么就用getattr(a,'b')
二.面向对象的基础
三大特性
基础的继承
基础的封装 __私有
两个内置函数:issubclass isinstance
反射: setattr/delattr 了解
内置方法: 你没有应用场景
__new__
__call__
__str__/__repr__
__len__
__***item__系列
__hash__
__eq__
issubclass(子类,父类),如果真的有继承关系,就返回True
- class A(object):pass
- class B(A):pass
- print(issubclass(B,A))
- # isinstance(对象,类)
- # class A(object):pass
- # a = A()
- # print(isinstance(a,A))
- # # 继承
- # class A(object):pass
- # class B(A):pass
- # b = B()
- # print(isinstance(b,A)) # 检测的对象是不是某个类以及其父类的对象
- # print(type(b) is B) # 检测的是对象是不是某一个类的实例
- # print(type(b) is A)
- 所有的反射 都是用字符串 操作对象的属性
- class A:
- def __init__(self,name,age):
- self.name = name
- self.age = age
- a = A('alex',83)
- # hasattr
- # print(getattr(a,'name'))#alex
- # a.sex = '不详'
- # setattr(a,'sex','不详')
- # print(a.sex)#不详
- del a.age
- # delattr(a,'age')
- print(a.__dict__)#{'name': 'alex', 'sex': '不详'}
- # 关于内置方法的名字
- # 内置方法 双下方法 魔术方法
- # 内置方法的特点
- # 一定有某一个语法或者一种写法自动触发这个方法
- # 重点掌握的
- # 哪些写法 触发 对应的内置方法
- # 实例化 __new__\__init__ 构造方法(单例模式)\初始化方法
- # 对象() __call__
- # del 对象 __del__ 析构方法\对象删除之前的收尾工作
- # print(对象) __str__ 让一个对象的显示更加清晰
- # str(对象)
- # '%s'%对象
- # repr() __repr__ 是__str__的备胎,并且还和repr(),%r格式化有关系
- # '%r'%对象
- # len(对象) __len__
- # 对象[参数] item系列
- # == __eq__
- __call__ 对象用call方法可以调用函数__call__里的方法
- # __call__
- class Student():
- def __init__(self,name,age):
- self.name = name
- self.age = age
- def call(self):pass
- def __call__(self, *args, **kwargs):
- print('调用我啦')
- alex = Student('alex',83)
- # callable #查看某个变量能否被调用
- # callable(变量) #返回True,那么 变量() --> 调用
- print(callable(Student))#True
- print(callable(alex))#True
- # alex()
- alex.call()#调用我啦
- class Dog(object):
- def __new__(cls, *args, **kwargs):
- pass
- dog_obj = object.__new__(cls)#调用父类object的__new__内置方法
- dog_obj = super().__new__(cls)##调用父类object的__new__内置方法,第二种方法
- return dog_obj
- def __init__(self,name,age):
- self.name = name
- self.age = age
- wc = Dog('旺财',2)
- print(wc.name)
- # 一个类 只能实例化一次的方法
- class Teacher:
- flag = None
- def __new__(cls, *args, **kwargs):
- if cls.flag is None:
- cls.flag = object.__new__(cls) # 这一句话只能走一次
- return cls.flag
- def __init__(self,name):
- self.name = name
- alex1 = Teacher('alex')
- alex2 = Teacher('alex')
- yuan = Teacher('yuan')
- print(alex2.name)#yuan
- print(yuan.name)#yuan
- __del__
- # 析构方法(了解) 删除
- class Teacher:
- def __init__(self,name):
- self.name = name
- def __del__(self):
- print('执行我啦')
- alex = Teacher('ALEX')
- del alex
- print('hahaha')
- # del alex # 执行del 对象的时候 触发__del__,在真正的删除alex对象之前,执行的方法__del__
- # 如果我们自己不删除alex,那么在程序的执行过程中或者最后,垃圾回收机制会替你执行del alex
- # 1.del alex
- # 2.执行__del__
- # 3.删除alex
- class File(object):
- def __init__(self,file_name):
- self.f = open('file_name')
- def read(self):
- self.f.read(1024)
- def __del__(self):# 对象使用的一些操作系统的资源的归还工作/收尾工作
- self.f.close()
- __str__
- class Course:
- def __init__(self,name,price,period,teacher):
- self.name = name
- self.price = price
- self.period = period
- self.teacher = teacher
- def __str__(self): # 必须有返回值,必须返回一个str类型
- return '%s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
- course_lst = []
- python = Course('python',19800,'6 months','baoyuan')
- linux = Course('linux',16800,'5 months','oldboy')
- print(python)
- print(str(python))
- print('课程展示 : %s'%python)
- class Course:
- def __init__(self,name,price,period,teacher):
- self.name = name
- self.price = price
- self.period = period
- self.teacher = teacher
- def __str__(self): # 必须有返回值,必须返回一个str类型
- return '%s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
- course_lst = []
- python = Course('python',19800,'6 months','baoyuan')
- linux = Course('linux',16800,'5 months','oldboy')
- print(python)
- print(str(python))
- print('课程展示 : %s'%python)
- # list.__str__()
- l = [1,2,3,4] # 对象 列表的对象
- print(l)
- print('[%s,%s,%s]'%(l[0],l[1],l[2]))
- __repr__ 是str方法的备胎(有str调用str,没有str走repr)
- class Course:
- def __init__(self,name,price,period,teacher):
- self.name = name
- self.price = price
- self.period = period
- self.teacher = teacher
- def __repr__(self): # 必须有返回值,必须返回一个str类型
- return 'repr --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
- def __str__(self): # 必须有返回值,必须返回一个str类型
- return 'str --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
- python = Course('python',19800,'6 months','baoyuan')
- linux = Course('linux',16800,'5 months','oldboy')
- print(python)
- print(linux)
- class Course:
- def __init__(self,name,price,period,teacher):
- self.name = name
- self.price = price
- self.period = period
- self.teacher = teacher
- def __repr__(self): # 必须有返回值,必须返回一个str类型
- return 'repr --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
- def __str__(self): # 必须有返回值,必须返回一个str类型
- return 'str --> : %s,%s,%s,%s'%(self.name,self.price,self.period,self.teacher)
- python = Course('python',19800,'6 months','baoyuan')
- linux = Course('linux',16800,'5 months','oldboy')
- print('%r'%python)#repr --> : python,19800,6 months,baoyuan
- print('%s'%python)#str --> : python,19800,6 months,baoyuan
- print(str(python))#str --> : python,19800,6 months,baoyuan
- print(repr(python))#repr --> : python,19800,6 months,baoyuan
- # 流畅的python : repr和str 如果只能写一个的 写repr
- class Course:
- def __init__(self,name,price,period,teacher):
- self.name = name
- self.price = price
- self.period = period
- self.teacher = teacher
- def __len__(self):
- return len(self.__dict__)
- def __getitem__(self,item):
- return self.__dict__[item]
- def __setitem__(self, key, value):
- self.__dict__[key] = value
- def __delitem__(self, key):
- self.__dict__.pop(key)
- python = Course('python',19800,'6 months','baoyuan')
- print(len(python))
- print(python.name)
- print(python['name']) # ==> 调用getitem
- print(python['price']) # ==> 调用getitem
- python['name'] = 'python2.0'
- print(python.name)
- # del python.name#与下一句功能一样
- del python['name']
- print(python.__dict__)#{'price': 19800, 'period': '6 months', 'teacher': 'baoyuan'}
- # 有一些内置的函数/模块 要想能正确的使用它们 那么必须按照它规定的语法来实现
- __len__ 测量对象长度
- class Ruler:
- def __init__(self,price,length,jingdu):
- self.length = length
- self.price = price
- self.jingdu = jingdu
- def __len__(self):
- return self.length
- stu_ruler = Ruler(2.5,15,0.1)
- print(len(stu_ruler))#15
- __eq__ s1==s2 等于 s1.__eq__(s2)
- class Student():
- def __init__(self,name,age):
- self.name = name
- self.age = age
- def __eq__(self, other):
- if self.name == other.name and self.age == other.age:
- return True
- return False
- s1 = Student('贾卫东',20)
- s2 = Student('贾卫东',20)
- print(s1 == s2) # s1.__eq__(s2)#True
- print(s1 is s2) # s1.__eq__(s2)#False
- #够通过这个字符串 --> 程序中的变量名(类名\函数名\变量名\方法名\对象名)
- class Manager:pass
- class Student:pass
- class Teacher:pass
- identify = 'Student'
- print(eval(identify)())#<__main__.Student object at 0x00000000025657B8>
反射 hasattr getattr
- class Person:
- role = '人类'
- Country = '中国'
- attr = input('>>>') # role 人类
- # # Country 中国
- print(getattr(Person,'role'))
- print(getattr(Person,'Country'))
- if hasattr(Person,attr):
- print(getattr(Person,attr))
- if attr == 'role':
- print(Person.role)
- elif attr == 'Country':
- print(Person.Country)
- class Person:
- role = '人类'
- @staticmethod
- def show_courses():
- print('所有课程')
- # 反射类中的方法
- # class Person:
- # role = '人类'
- # @staticmethod
- # def show_courses():
- # print('所有课程')
- # Person.role == getattr(Person,'role')
- # Person.show_courses() == getattr(Person,'show_courses')()
- # ret = getattr(Person,'show_courses')
- # ret()
- # 有一个类,有很多静态属性,也有很多静态方法/类方法
- # 用户输入input任意的属性名或者方法名,
- # 如果是属性 直接打印 - 用到一个内置函数#getattr(Person,'role')
- # 如果是方法 直接调用 - 用到一个内置函数#getattr(Person,'show_courses')
- # 要求程序不报错
day31 Pyhton 面向对象的基础 三大特性的更多相关文章
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- PHP其它常用函数;<<<面向对象(OPP)的三大特性:封装、继承、加态:>>> <----面试题 ;构造方法、析构方法,魔术方法、set、get方法;静态;抽象类;接口
PHP其它常用函数: 赋值:$r->name = "元素"; 取值: echo $r->name; count() 计算数组中的元素数目或对象中 ...
- Java面向对象概述和三大特性
Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- 前端学PHP之面向对象系列第三篇——三大特性
× 目录 [1]封装 [2]继承[3]多态 前面的话 php面向对象编程的三大特性是封装性.继承性和多态性.本文将介绍php的这三大特性 封装 封装就是把对象中的成员属性和成员方法加上访问修饰符( p ...
- java基础(三)-----java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- java基础(一)-----java的三大特性之封装
面向对象编程有三大特性:封装.继承.多态.本文将介绍java的三大特性之封装 封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成 ...
- 3.java面向对象编程三大特性之多态
面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对类的外部而言它的内部实现细节是隐藏的,暴露给外界的只是它的实现方法. ...
随机推荐
- Git 实用操作:撤销 Commit 提交
有的时候,改完代码提交 commit 后发现写得实在太烂了,连自己的都看不下去,与其修改它还不如丢弃重写.怎么操作呢? 使用 reset 撤销 如果是最近提交的 commit 要丢弃重写可以用 res ...
- lua数据结构之table的内部实现
一.table结构 1.Table结构体 首先了解一下table结构的组成结构,table是存放在GCObject里的.结构如下: typedef struct Table { CommonH ...
- python之ddt模块使用
一.DDT(数据驱动)简介 Data-Driven Tests(DDT)即数据驱动测试,可以实现不同数据运行同一个测试用例(通过数据的不同来驱动测试结果的不同). ddt本质其实就是装饰器,一组数据一 ...
- dict字典,以及字典的一些基本应用
dict表示方法: dict={}或d=dict() 1.字典的增:d['元素名']='元素值'.或d.setdefault('key','value') 2.字典的删:d.pop(key).或del ...
- C、算法、操作系统杂记《malloc 0大小是什么行为》
linux手册上的说明 If size is 0, then malloc() returns either NULL, or a unique pointer value that can late ...
- 突然挂了!Redis缓存都在内存中,这下完了!
我是Redis,一个叫Antirez的男人把我带到了这个世界上. “快醒醒!快醒醒!”,隐隐约约,我听到有人在叫我. 慢慢睁开眼睛,原来旁边是MySQL大哥. “我怎么睡着了?” “嗨,你刚才是不是出 ...
- Docker之简单操作
安装完Docker后,我们就可以与Docker进行交互来创建和管理容器等操作. 容器生命周期管理: 创建一个新的容器并运行一个命令 docker run [OPTIONS] IMAGE [COMMAN ...
- 必须了解的mysql三大日志-binlog、redo log和undo log
日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志.查询日志.慢查询日志.事务日志.二进制日志几大类.作为开发,我们重点需要关注的是二进制日志( ...
- java注解(1)
Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.注解是Java SE5中引入的重要的语言 ...
- Redis5设计与源码分析读后感(一)认识Redis
一.初识redis 定义 Redis是一个开源的Key-Value数据库,通常被称为数据结构服务器,其值可以是多种常见的数据格式,且读写性能极高,且所有操作都是原子性的. 高性能的主要原因 1.基于内 ...