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面向对象编程三大特性之多态
		
面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对类的外部而言它的内部实现细节是隐藏的,暴露给外界的只是它的实现方法. ...
 
随机推荐
- AES字节数组加密解密流程
			
AES类时微软MSDN中最常用的加密类,微软官网也有例子,参考链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.crypto ...
 - 设计模式也可以这么简单(7年开发老鸟PS注释总结)
			
设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four (GoF) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分 ...
 - python的logging模块及应用
			
一.logging日志模块等级 常见log级别从高到低: CRITICAL >ERROR >WARNING >INFO >DEBUG,默认等级为WARNING,即>=WA ...
 - 《Java核心技术卷一》之 泛型
			
一.引言 在学习集合的时候我们会发现一个问题,将一个对象丢到集合中后,集合并不记住对象的类型,统统都当做Object处理,这样我们取出来再使用时就得强制转换类型,导致代码臃肿,而且加入集合时都是以Ob ...
 - vue 项目中实时请求接口 建立长连接
			
需求:在项目中需要每隔五秒请求一次接口 第一种方法:直接在mounted钩子函数中处理 mounted() { window.setInterval(() => { setTimeout(thi ...
 - 从C++入手,探寻java的特点
			
java的特点 java语言建立在成熟的算法语言和坚实的面向对象理论的基础上,具有强大的应用系统设计能力,其具备的跨平台特型,其具备的跨平台特型.面向对象和可靠性.安全性等特点是它能够充分适应网络需要 ...
 - splunk公司的一道笔试题
			
题目要求: 一个游泳馆里有很多储物柜,每个储物柜都有一个ID号,但是老板不喜欢4这个数字,所以ID号里都不能有4,ID号从1开始编号,让你设计所有储物柜的ID号,用程序输出,比如输入 4输出 5输 ...
 - Java源码赏析(四)Java常见注解
			
元注解 @Target :标识注解的目标,默认为所有 ElementType.TYPE(用于类) ElementType.FIELD(用于域,包括enum) ElementType.METHOD(用于 ...
 - 刷题[WUSTCTF2020]CV Maker
			
解题思路 好家伙,打开一看像是cms,又看名字CV Maker.我以为直接要搜cve打了.搜了一会发现没什么啊.那先正常做把. 注册 注册成功后这里报错,猜测可能有注入点.先放在这里,继续登陆.发现是 ...
 - [De1CTF 2019]Giftbox 分析&&TPOP学习
			
[De1CTF 2019]Giftbox 刚进来我以为是直接给了shell,恐怖如斯. 随便扔了个命令,之后就没然后了,hhh,截包发现可能存在sql注入. 然后我就不会了... what i lea ...