百万年薪python之路 -- 面向对象之所有属性及方法
1.私有成员公有成员
1.1 类的私有属性
# class A:
#
# name = '周道镕'
# __name = 'zdr' # 私有类的属性
#
# def func(self):
# print(self.name)
# print(self.__name)
# obj = A()
# obj.func()
结论:在类的内部可以访问
# class A:
# name = '周道镕'
# __name = 'zdr' # 私有类的属性
#
# def func(self):
# pass
# obj = A()
# print(obj.name)
# print(A.__name) #报错
# print(obj.__name) #报错
结论:类的外部不能访问
# class A:
# name = '周道镕'
# __name = 'zdr' # 私有类的属性
#
# class B(A):
# def func(self):
# print(self.__name)
#
# obj = B()
# # print(obj.__name)
# obj.func() # 报错
结论:类的派生类不能访问
1.2 类的私有方法
# class A:
#
# def func(self):
# self.__func()
# print('in A func')
#
# def __func(self):
# print('in A __func')
#
# obj = A()
# obj.func()
# obj.__func() # 报错
结论:类的私有方法不能在类的外部使用
1.3 对象的私有方法
class A:
def __init__(self,username,pwd):
self.username = username
self.__pwd = pwd
def md5(self):
self.__pwd = self.__pwd + '123'
obj = A("7255322","123456789")
print(obj.__pwd) # 报错
结论: 只能在类的内部使用,不能在类的外部使用以及派生类使用
私有成员来说: 当你遇到重要的数据,功能,(只允许本类使用的一些方法,数据)设置成私有成员.
python的所有私有成员都是纸老虎,形同虚设
class A:
name = '周道镕'
__name = 'zdr' # 私有类的属性#
def __func(self):
print('in __func')
print(A.__dict__)
print(A._A__name)
A._A__func(123)
obj = A()
obj._A__func()
类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上 _类名 .
2.实例方法
实例方法就是类的实例能够使用的方法
class A:
def func(self):
print('实例方法')
3.类方法
加classmethod装饰器的方法就是类方法
class A:
def func(self):
print('实例方法')
@classmethod
def cls_func(cls):
# print(f'cls---->{cls}')
obj = cls()
print(obj)
print('类方法')
# A.cls_func()
# obj = A()
# obj.cls_func()
类方法: 一般就是通过类名去调用的方法,并且自动将类名地址传给cls,但是如果通过对象调用也可以,但是传的地址还是类名地址.
类方法有什么用???
1. 得到类名可以实例化对象.
2. 可以操作类的属性.
4.静态方法
使用装饰器@staticmethod。
# class A:
#
# def func(self):
# print('实例方法')
#
#
# @classmethod
# def cls_func(cls):
# pass
#
# @staticmethod
# def static_func():
# print('静态方法')
静态方法是不依赖于对象与类的,其实静态方法就是函数.
使用了静态方法(函数),然而方法体中并没使用(也不能使用)类或实例的属性(或方法)
保证代码的规范性,合理的划分.后续维护性高.
5.属性
class Bmi:
def __init__(self,name,height,weight):
self.name = name
self.height = height
self.weight = weight
def bmi(self):
return self.weight/self.height**2
obj = Bmi('赵嘎', 1.83, 65)
print(obj.bmi())
# 结果虽然实现了,但是逻辑上感觉不合理.bmi应该是类似于name,age,height,等名词,
# 但是你把它当做方法使用了.
class Bmi:
def __init__(self,name,height,weight):
self.name = name
self.height = height
self.weight = weight
@property
def bmi(self):
return self.weight/self.height**2
obj = Bmi('赵嘎', 1.83, 65)
print(obj.bmi)
# property 将执行一个函数需要函数名()变换成直接函数名.
# 将动态方法 伪装 成了一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理.
obj.bmi
obj.bmi
obj.bmi = 666
del obj.bmi
# property 他是一个组合.
class Foo:
@property
def bmi(self):
print('get的时候运行我啊')
@bmi.setter
def bmi(self,value):
print(value)
print('set的时候运行我啊')
# return 111 # 无法得到返回值
@bmi.deleter
def bmi(self):
print('delete的时候运行我啊')
# return 111 # 无法得到返回值
obj = Foo()
# obj.bmi
obj.bmi = 666 # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数
# obj.bmi(666)
del obj.bmi
# 应用场景:
# 1, 面试会考一些基本的调用,流程.
# 2, 工作中如果遇到了一些类似于属性的方法名,可以让其伪装成属性.
# 设置属性的两种方式:
# 1, 利用装饰器设置属性.
class Foo:
@property
def bmi(self):
print('get的时候运行我啊')
@bmi.setter
def bmi(self,value):
print(value)
print('set的时候运行我啊')
# return 111 # 无法得到返回值
@bmi.deleter
def bmi(self):
print('delete的时候运行我啊')
# return 111 # 无法得到返回值
# 2. 利用实例化对象的方式设置属性.
class Foo:
def get_AAA(self):
print('get的时候运行我啊')
def set_AAA(self,value):
print('set的时候运行我啊')
def delete_AAA(self):
print('delete的时候运行我啊')
AAA = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应
f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA
6.issubclass isinstance区别
# isinstance 判断的是对象与类的关系
class A:
pass
class B(A):
pass
obj = B()
# isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
# print(isinstance(obj, B)) # True
# print(isinstance(obj, A)) # True
# issubclass 类与类之间的关系
class A:
pass
class B(A):
pass
class C(B):
pass
# issubclass(a,b) 判断的是 a类是否是b类 或者 b类派生类 的派生类.
# issubclass(a,b) 判断的是 a类是否是b类 子孙类.
# print(issubclass(B,A))
# print(issubclass(C,A))
课外了解
按照Python的一切皆对象理论,类其实也是一个对象,那么类这个对象是从哪里实例化出来的呢?
print(type('abc'))
print(type(True))
print(type(100))
print(type([1, 2, 3]))
print(type({'name': '太白金星'}))
print(type((1,2,3)))
print(type(object))
class A:
pass
print(isinstance(A, type)) # True
print(isinstance(object,type)) # True
print(issubclass(type,object)) # True
type元类是获取该对象从属于的类,而type类比较特殊,Python原则是:一切皆对象,其实类也可以理解为'对象',而type元类又称作构建类,python中大多数内置的类(包括object)以及自己定义的类,都是由type元类创造的。而type类与object类之间的关系比较独特:object是type类的实例,而type类是object类的子类,这种关系比较神奇无法使用python的代码表述,因为定义其中一个之前另一个必须存在。所以这个只作为了解。
百万年薪python之路 -- 面向对象之所有属性及方法的更多相关文章
- 百万年薪python之路 -- 面向对象之继承
面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...
- 百万年薪python之路 -- 面向对象之 反射,双下方法
面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...
- 百万年薪python之路 -- 面向对象之三大特性
1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...
- 百万年薪python之路 -- 面向对象之:类空间问题以及类之间的关系
面向对象之:类空间问题以及类之间的关系 1.从空间角度研究类 1.何处添加对象属性 class A: def __init__(self,name): self.name = name def fun ...
- 百万年薪python之路 -- 面向对象初始
面向对象初始 1.1 面向过程编程vs函数式编程 函数编程较之面向过程编程最明显的两个特点: 1,减少代码的重用性. 2,增强代码的可读性. 1.2 函数式编程vs面向对象编程 面向对象编程:是一类相 ...
- 百万年薪python之路 -- JS基础介绍及数据类型
JS代码的引入 方式1: <script> alert('兽人永不为奴!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script src ...
- 百万年薪python之路 -- 数据库初始
一. 数据库初始 1. 为什么要有数据库? 先来一个场景: 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时 ...
- 百万年薪python之路 -- 并发编程之 协程
协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...
- 百万年薪python之路 -- 前端CSS样式
CSS样式 控制高度和宽度 width宽度 height高度 块级标签能设置高度和宽度,而内联标签不能设置高度和宽度,内联标签的高度宽度由标签内部的内容来决定. 示例: <!DOCTYPE ht ...
随机推荐
- 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践
1. 遗传编程简介 0x1:什么是遗传编程算法,和传统机器学习算法有什么区别 传统上,我们接触的机器学习算法,都是被设计为解决某一个某一类问题的确定性算法.对于这些机器学习算法来说,唯一的灵活性体现在 ...
- 【linux】【jenkins】自动化运维六 构建生成备份
push tag用于提交代码构建成功后push tag,以防提交代码报错,方便回滚之前正常的代码. 由于采用docker部署的形式,构建失败自动回滚还未实现,待研究解决. 构建后操作选择 Git Pu ...
- java算法基础范例
题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3 ...
- 删除pdf中的链接
在Acrobat中打开pdf文件,然后:编辑→首选项→一般→自动从文本检测URL,把此处的对勾去掉,以后就不会变为食指按的形状了! 还有以下的方法 方法1:“高级(A)”→“链接(L)”→“删除文档中 ...
- windows无法安装到这个磁盘怎样解决,及激活
在cmd输入.sql server 2008 slmgr.vbs -ipk KH2J9-PC326-T44D4-39H6V-TVPBY 这个问题遇到的挺多次的,依稀记得上次搞这个问题搞了很久,今天 ...
- 基于RHEL8/CentOS8的网络基础配置
在rhel7上,同时支持network.service和NetworkManager.service(简称NM).默认情况下,这2个服务都有开启,但许多人都会将NM禁用掉.而在rhel8上,已废弃ne ...
- Redis数据库之服务器主从配置
目的 主要培养对分布式REDIS主从复制架构运用的能力.理解并掌握REPLICATION工作原理的同时,能独立配置Replication ,使数据库运行在主从架格上.针对主从复制架构的运用,着力掌握S ...
- HTML5-常用正则表达式
有关H5正则表达式的一些常用式子,希望热爱编程的同学们多多指教,还有也希望可以关注收藏本站哦!❤^_^❤ 一.校验数字的表达式 1. 数字:^[0-9]*$ 2. n位的数字:^\d{n}$ 3. 至 ...
- pikachu-数字型注入(post)#手工注入
1, 因为是post型,所以需要抓取数据包 2, 测试结果为数字型注入 提交恒等的语句可以查询到所有的数据信息 3, 使用UNION联合查询法 判断字段数,测试为2个字段时没有报错,所以可以判断字段数 ...
- 正睿OI国庆day1
正睿OI国庆day1 T1 \[ S_n=1*S_{n-1}+1*F_{n-1}+1*F_{n-2}+1*f_{n-1}+1*f_{n-2} \] \[ F_{n}=0*S_{n-1}+1*F_{n- ...