day30 Pyhton 面向对象 继承.装饰器
一面向对象相关
谈谈你对面向对象的理解
1.泛泛谈:什么情况下使用面向对象
2.针对面向对象的 封装 继承 多态一个一个的谈
3.根据你工作中的实际情况对应来举例子
封装
1.广义上:普遍的大家认为的封装,就是把一类相同属性和方法的事务抽象为一个类
把属性和方法封装在一个类中
是为了复杂的角色关系的程序中,能够把属于各个角色的方法分开
使得代码更加简洁 清晰(狗不能调用attack,人不能调用bite)
狭义上:在类中,可以定义一些私有成员(静态属性,方法,对象的属性)
__私有的成员名,就定义为私有的了
不能在类的外部使用,也不能被继承,旨在保护类中的一些信息
应该知道
为什么私有的成员不能在类的外部直接使用?
所有的私有成员,都是在创建的时候变异了,变成_类名__私有的成员名
为什么私有的成员可以直接在类的内部使用?
在类的内部使用私有成员的时候,类会自动的在这些成员的前面加上_类名
什么情况下使用封装:
某一个属性(静态属性\对象属性):不想被查看,不想被随意修改(只能看,但是不能(随意)改)
某一个方法: 不想被外部调用
不善于使用封装的概念,分不清楚什么情况下使用:
最好能够符合规范的开发
即使没有恰当的使用封装,也不影响我们实现代码的功能
二.
子类不能继承父类的私有方法
class Foo(object):
# A = 123
# __私有的静态变量 = 'ABC' # _Foo__私有的静态变量
# print('---> ',__私有的静态变量) # 在类的内部使用 _Foo__私有的静态变量
#
# class Son(Foo):
# def func(self):
# print('--> 1 ',Son.A) # 子类没有找父类,能找到
# print('--> 2 ',Foo.__私有的静态变量) # 子类没有找父类,找不到"_Son__私有的静态变量"
type object 'Foo' has no attribute '_Son__私有的静态变量'
# # print(Foo.__私有的静态变量)
# Son().func()
子类的内部不能使用父类的私有方法
class Foo(object):
def __func(self): # self._Foo__func
print('in foo') class Son(Foo):
def wahaha(self):
self.__func() # self._Son__func,不能在子类的内部使用父类的私有方法 s = Son()
s.wahaha()
class Foo(object):
def __init__(self):
self.__func() # _Foo__func
self.func() def __func(self):print('in Foo __func') # _Foo__func def func(self):print('in Foo func') class Son(Foo):
def __func(self):print('in Son __func') # _Son__func def func(self):print('in Son func')
Foo()._Foo__func()
Son()
# 调用私有的方法或者属性
# 不需要考虑self是谁的对象
# 只要是私有的方法或者属性,就一定是在调用的当前类中执行方法
# 当某个方法或者属性,不希望被子类继承的时候,也可以把这个方法\属性定义成私有成员
三.三个装饰器方法
@classmethod
@property
@staticmethod
class A:
__count = 0 # 隐藏了count属性
def __init__(self,name):
self.name = name
self.__add_count() # 每一次实例化的时候调
# 用私有方法来对__count进行累加
@classmethod
def __add_count(cls): # 定义一个私有的方法
# print(cls,A)
cls.__count += 1 # 让这个方法只能在类的内部被使用 @classmethod # 被classmethod装饰器装饰的方法,都有一个默认的参数,这个参数就是当前类
def show_count(cls): # 定义一个普通方法,
# print(cls,A)
return cls.__count # 让用户可以从外部查看__count的值 print(A.show_count())
alex = A('alex')
print(alex.show_count())
yuan = A('yuan')
print(A.show_count())
为什么有类方法
# 有的时候,
# 在类中会有一种情况,就是这个方法并不需要使用某一个对象的属性
# 因此 这个方法中的self参数是一个完全无用的参数
# show_count是一个查看类中属性的方法,这样的方法和某一个对象并没有直接联系 # 本质上 : 一个方法不用对象属性但是使用静态属性 -- 类方法@classmethod
# 某一个方法被创造出来,就是为了进行对静态变量进行操作
# 根本不涉及到对象
# 所以这个方法就应该被定义成 类方法(被@classmethod装饰)
# 调用这个类方法,可以使用对象调用,也可以使用类调用
# 但是这个方法的默认参数永远是当前类的命名空间,而不是对象的
# 如果一个类中的方法不用对象属性也不用静态属性 -- 静态方法@staticmethod
# 那实际上这个方法就是一个普通的函数
class User(object):
@staticmethod
def login(arg1,arg2): # 是User类中的名字 函数的名字 login就是一个类中的静态方法,本质上就是一个函数
print(arg1,arg2)
return (arg1+arg2)
class Student(User):pass
class Manager(User):pass ret = User.login(1,2)
print(ret)#3
a=Student.login(2,4)
print(a)#6
b=Manager.login(2,3)
print(b)#5
# 普通的方法 类方法 静态方法
# 默认参数 self cls 无
# 操作的变量 操作对象的属性 操作静态属性 既不操作对象属性,也不操作类的属性
# 所属的命名空间 类 类 类
# 调用方式 对象 类/对象 类/对象
# 对应的装饰器 无 @classmethod @staticmethod
# 用哪一个命名空间中的名字,就定义不同的方法
# 只要用self 就是普通方法,只能用对象调
# 只要用cls 就是类方法,可以用类,可以用对象
# 啥也不用 就是静态方法,可以用类,可以用对象 # 私有的
# 私有的普通方法
# 私有的类方法
# 私有的静态方法 # 先定义类
# 写方法
# 写具体的方法中的代码
# 写完之后,发现没有用到self,那么如果用到类,就定义成类方法,如果啥也没用到,静态方法 # 先定义函数
# 写函数
# 写具体函数中的代码
# 写完之后,发现要挪进类里,如果啥也没用到,静态方法;如果用到类,就定义成类方法
day30 Pyhton 面向对象 继承.装饰器的更多相关文章
- python基础-面向对象(装饰器)
属性: @property @method_name.setter @method_name.deleter 三个标签都是放在方法的上面来使用,且方法名要和后续使用的 变量名字相一 ...
- python中面向对象之装饰器
python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...
- Python面向对象-@property装饰器
python中,我们可以直接添加和修改属性的值: >>> class Student(object): ... pass ... >>> s = Student() ...
- Python 基础之面向对象之装饰器@property
一.定义 装饰器@property可以把方法变成属性使用作用: 控制类内成员的获取 设置 删除获取 @property设置 @自定义名.setter删除 @自定义名.deleter 二.具体实现 1. ...
- day30 Pyhton 面向对象 反射
@property # 例1 - 1 (某一个属性如果是通过计算得来的,那么计算的过程写在方法里,把这个方法伪装成属性) from math import pi # class Circle: # d ...
- day28 Pyhton 面向对象 继承
1.昨日回顾 类的命名空间 静态属性\动态属性(方法) 对象的命名空间 #对象的属性 #类指针:对象能够通过这个类指针找到类 #静态属性:属于类,多个对象共享这个资源 #尽量用类名来操作静态属性 #对 ...
- day29 Pyhton 面向对象 继承进阶
一.内容回顾 初识继承 父类\基类\超类 子类\派生类 派生 :派生方法.派生属性 单继承 继承的语法class子类名(父类名) 解决开发中代码冗余的问题 子类继承了父类之后,可以调用父类中的方法 如 ...
- Python-老男孩-02_装饰器_面向对象_封装_继承_异常_接口_数据库
装饰器其实也是一个函数,它的参数是一个函数 ; 其它函数与装饰器之间建立联系是通过 @装饰器函数名, 感觉有点像Spring的面向切面编程 装饰器函数,如何处理原函数的参数.? 装饰器 原函数返回值 ...
- 初识面向对象-封装、property装饰器、staticmathod(静态的方法)、classmethod(类方法) (五)
封装 # class Room:# def __init__(self,name,length,width):# self.__name = name# self.__length = length# ...
随机推荐
- 上传文件到服务器指定位置 & 从服务器指定位置下载文件
需要的jar包: 去maven仓库自己搜索com.jcraft下载jar包 <dependency> <groupId>com.jcraft</groupId> & ...
- java实现zip文件的解压
使用到的包 org.apache.commons 下载文件 url:文件所在地址需要是http:// filePath:将下载的文件保存的路径 public static void getDownlo ...
- 快速生成网络mp4视频缩略图技术
背景 由于网络原因,在下载视频之前我们往往会希望能够先生成一些视频的缩略图,大致浏览视频内容,再确定是否应花时间下载.如何能够快速得到视频多个帧的缩略图的同时尽量少的下载视频的内容,是一个值得研究的问 ...
- 测试软件—禅道BUG管理工具
入禅 目录 入禅 1.禅道的基本使用 1.禅道的基本使用 admin(管理员) 部门:创建部门(需求部门,开发部门,测试部门,项目部门,产品部门) 组织:创建用户(产品经理,项目经理,开发人员,测试人 ...
- Java 审计之SSRF篇
Java 审计之SSRF篇 0x00 前言 本篇文章来记录一下Java SSRF的审计学习相关内容. 0x01 SSRF漏洞详解 原理: 服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过 ...
- FFmpeg开发笔记(五):ffmpeg解码的基本流程详解(ffmpeg3新解码api)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- JVM垃圾回收器前瞻
垃圾回收器的新发展 GC仍然处于飞速发展之中,目前的默认选项G1 GC在不断的进行改进,很多我们原来认为的缺点,例如串行的Full GC.Card Table扫描的低效等,都已经被大幅改进,例如, ...
- JVM垃圾回收安全点Safe Point
GC安全点(Safepoint) 程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint) ” Safe Point的选择很重要, ...
- Python爬虫开发者工具介绍
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. chrome 开发者工具 当我们爬取不同的网站时,每个网站页面的实现方式各不相同,我们需要对 ...
- Do not use built-in or reserved HTML elements as component id:mask vue报错
今天学习了一下vue的组件,但是报了一个错误 Do not use built-in or reserved HTML elements as component id:mask , 经过查询得知是因 ...