对象 绑定关系 隐藏属性 property 继承
绑定方法两种:
1、绑定给对象的
class Student():
country = 'CHINA'
def __init__(self,name,age):
self.name = name
self.age = age
def tell_info(self):
print('%s-30' %(self.name,self.age))
obj = Student('jesse',12)
obj.tell_info()
# 对象调参数,类里面的函数tell_info本来就有参数,所以不用传,所以是绑定说是给对象的
2、绑定给类的
类方法是绑定给类的,类来调用,把类名当作第一个参数传入
# 建一个settings.py 文件
# 文件内容:
# IP = '192.168.1.101'
# PORT = 3306
import settings
class Mysql():
country = 'CHINA'
def __init__(self, ip, port):
self.ip = ip
self.port = port
def tell_info(self):
print('IP地址为:%s 端口为:%s' % (self.ip, self.port))
@classmethod
def from_config(cls): # 从配置文件导入
obj = cls(settings.IP, settings.PORT)
return obj
obj = Mysql.from_config()
Mysql.tell_info(obj)
# obj = Mysql(settings.IP,setting.PORT)
# 这里的Mysql写死了需要将类名写活
# 就用到了 @classmethod装饰器
# 这个装饰器将:
# Mysql.from_config() 前面的类名传到函数括号里面
obj = Mysql.from_config()
Mysql.tell_info(obj)
注意如果发生既想绑定给对象又想绑定给类的情况我们就直接将它绑定给对象,让后用self.___class_方法 来绑定给类
非绑定方法
即不绑定给对象,也不绑定给类
先小小了解一下uuip模块
import uuid
print(uuid.uuid4())
# 会随机生成一串字符串
class Mysql():
def __init__(self,ip,port):
self.ip = ip
self.port = port
@staticmethod # 静态方法
def create_id():
# 这里下面没有需要用到对象的代码
# 所以这里是可以没有self的
# 但我们调用的时候用到了对象
# 我们可以用@staticmethod装饰器装饰一下
# 后面就可以用对象调用它了
import uuid
print(uuid.uuid4())
obj = Mysql('127.0.0.1',3306)
obj.create_id()
Mysql.creat_id() # 我们发现用类也可以调用了
# 这就是非绑定方法
参数用不到可以不用传,这就是非绑定方法
隐藏属性
1、如何隐藏属性?
class People():
__country = 'CHINA' # 在前面加__该属性就被隐藏了
def __init__(self,name,age)
self.name = name
self.age = age
obj = People('ly',18)
# 被隐藏就取不到了
print(People.__dict__) # 查看类里面的属性
# 会发现隐藏的__country 变成了_People__country
# 语法上在定义阶段进行了变形
# print(People._People__country) 这样就可以取出来了,但这样取就比较麻烦
# 删除和上面同理
该隐藏对外不对内,因为在函数定义阶段发生了变形,那所以包含该属性的代码也同时发生了变形。所以虽然在外部取不到,但是我们可以在写一个调用该属性的方法。
class People():
__country = 'CHINA'
def __init__(self,name,age)
self.name = name
self.age = age
def get_country(self):
return '国家:%s'% self.__country
obj = People('ly',18)
2、为什么要隐藏
该隐藏对外不对内,如果想访问类中隐藏属性,在类中开放对外访问的接口,可以更好的对外部做限制
class People():
__country = 'CHINA'
def __init__(self,name,age)
self.name = name
self.age = age
def get_country(self):
return '国家:%s'% self.__countr
def set_country(self,v):
if not type(v) is str:
print('country必须是str类型')
return
self.__country = v
# 对更改作出限制
def del_country(self):
print('不能删除')
peoperty装饰器
装饰器:装饰器实在不修改被张是对象原代码以及调用方式的前提下为被装饰对象添加新功能的可调用对象
'''
成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖,高于32
体质指数(BMI)= 体重(kg) 身高^2(m)
'''
class People():
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height
def bmi(self):
return self.weight / self.height ** 2
obj1 = People('jesse', 65, 1.75)
print(obj1.bmi())
property是一个装饰器,是用来绑定给对象的方法伪装成一个数据属性
class People():
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height
@property
def bmi(self):
return self.weight / self.height ** 2
obj1 = People('jesse', 65, 1.75)
print(obj1.bmi) # 加了property装饰器之后调用就不需要加括号
property的另一个语法,针对隐藏属性的操作,能够让使用者查找不到
class Student():
__school = '十三中' # 将学校属性隐藏起来
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def get_school(self):
return self.__school
def set_school(self,v)
if not type(v) is str:
print('学校名称必须为字符串')
return
self.name = v
def del_school(self):
print('不可以删除学校名称')
school = property(get_school,set_school,del_school)
# 将这些功能 加上property语法赋值给一个变量名,就可以通过变量名来进行操作了
obj1 = People('jesse','16','mael')
print(obj1.school) # 这样就能取出学校名字了相当于之前没加property的 print(obj1.get_school)
obj1.school = '十八中' # property 会检测语法,察觉到这是更改操作就会执行 obj1.set_school = '十八中'
del obj1.school # 也是同理
还有一种用法,和上面用法一样
class Student():
__school = '十三中' # 将学校属性隐藏起来
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
@property # 相当于 school = property(school)
def school(self):
return self.__school
@school.setter
def school(self,v)
if not type(v) is str:
print('学校名称必须为字符串')
return
self.name = v
@school.deleter
def school(self):
print('不可以删除学校名称')
# 加装饰器用法
1、先将所有功能函数名称定义成要伪装调用的函数名称,比如这里面我们就用school
2.在get_school功能上加一个property装饰器
在set_school功能上 @school.setter
在school.del功能上 @school.deleter
推荐用这种加装饰器的方式,更加清晰
继承
1、什么是继承
继承是一种创建新类的方式,新建的类可称为子类或派生类,父类又可以称之为基类或超类
在Python这门语言中是支持多继承的,即新建的类可以继承一个或多个父类
class Parent1:
pass
class Parent2:
pass
class Sub1(Parent1): # 单继承
pass
class Sub2(Parent1,Parent2): # 多继承
pass
print(Sub1.__bases__)
print(Sub2.__bases__)
在Python2中有经典类与新式类之分
新式类:继承了object类的子类,以及该子类的子类等
经典类:没有继承object类的子类,以及该子类的子类等
在Python3中没有继承任何类,那么就会默认继承object,所以Python中只有新式类
子类中没有的属性会去父类那找,
python的多继承:
优点:子类可以同时遗传多个父类的属性,最大限度的重用代码
缺点:代码可读性扩张性会变差,不建议使用多继承,如果一定要用,应该用使用Mixins
2、为什么要用继承
用来解决类与类之间代码冗余的问题,将共有的东西提取到父类当中
3、如何使用继承
class All_people():
school = '清华大学'
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
class Student(All_people):
def choose_course(self):
print('学生 %s 正在选课' %self.name)
class Teacher(All_people):
def __init__(self,name,age,gender,courses):
All_people.__init__(self,name,age,sex)
self.courses = courses
stu_obj = Student('jesse','18','male')
print(stu_obj.school)
对象 绑定关系 隐藏属性 property 继承的更多相关文章
- 2.java面向对象类与类/类与对象之间关系详解
继承.实现.依赖.关联.聚合.组合的联系与区别 下面的内容很基础,同时也很简单,但是也很重要. 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功 ...
- Spring IOC、对象依赖关系
Spring IOC.对象依赖关系 2016-09-21 01:36 414人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 引入 Strut ...
- Python学习day24-面向对象的三大特征之继承
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- O-C相关-06:对象与对象的关系
对象与对象的关系 1.对象与对象的关系 依赖 关联 组合 常常讨论对象与对象关系时会提供两个属于:内聚性,耦合性 内聚一般指功能上的指向性 耦合一般指关联上的依赖性 2.依赖: 对象之间最弱的一种关联 ...
- 浅谈python的对象的三大特性之继承
前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间. 现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性. 前面定义了一个人的类,可是我们还知道,人 ...
- 在SQL Server中查看对象依赖关系
原文 在SQL Server中查看对象依赖关系 Viewing object dependencies in SQL Server Deleting or changing objects may ...
- php课程 11-37 类和对象的关系是什么
php课程 11-37 类和对象的关系是什么 一.总结 一句话总结:类生成对象,对象是类的实例化,一定是先有类,后有对象,一定是先有标准,再有个体. 1.oop的三大优势是什么? 重用性,灵活性.扩展 ...
- Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本
前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...
- 自学Python5.5-面向对象三大基本特征_继承
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
随机推荐
- 在CentOS7环境下部署weblogic集群
一)环境准备 服务器操作版本系统 CentOS7 weblogic版本包 weblogic1036_generic.jar(weblogic11g) JDK jdk-8u191-linux-x64.t ...
- Windows软件包管理工具:Scoop
前言 删库跑路后,Windows系统如何快速安装应用程序,部署环境呢? 以前想过这个问题,最近在安装Hugo时发现使用软件包管理工具可以解决这个问题. 阅读建议 首先需要测试下载速度,尝试从官网下载, ...
- python -- 程序异常与调试(识别异常)
一.识别异常 程序中出现的错误又称为异常.异常通常分为两大类:编译错误和运行错误. 如下源码是已经修改: # -----------------------------------------# 编程 ...
- JAVA基础(代码)练习题61~90
JAVA基础 61.设计一个方法打印数组{'a','r','g','s','e','r'}中下标为1和3的的元素 package Homework_90; /** * 设计一个方法打印数组{'a',' ...
- windows系统下 PHP怎么安装redis扩展
在windows系统下安装redis就不赘述了,基本上就是下一步,下一步. 然后通过通过命令行启动服务. 我是在xamp 3.2.2的集成环境下进行本地redis扩展安装配置的,php的版本是5.6. ...
- dotnet部署出现Failed to load the dll from [ ... hostfxr.dll], HRESULT: 0x80070057
起因 最近看到.net core 3支持wpf了,尝试一下(如果可行,会特别利于脱离.net运行时) dotnet new wpf dotnet publish -c Release -r win-x ...
- 题解 P6892 [ICPC2014 WF]Baggage
解题思路 非常好的一道构造题. 在手动模拟几个样例(也许不止几个)之后呢. 就可以发现其实这些操作的开始以及最后几步是有相通之处的. 关于手动模拟的样例放在了文章末尾,需要的自取. 先考虑操作次数. ...
- phpmyadmin scripts/setup.php 反序列化漏洞(WooYun-2016-199433)
phpmyadmin 2.x版本 POST /scripts/setup.php HTTP/1.1 Host: 192.168.49.2:8080 Accept-Encoding: gzip, def ...
- Elsevier(爱思唯尔)期刊模板的使用
1.爱思唯尔(Elsevier)期刊模板的使用 2.sci论文(以Elsevier为例) latex文件从小白到投稿 3.初次使用爱斯维尔(Elsevier)论文模板遇到的坑 4.latex学习 da ...
- Appium使用inspactor开始session报"Could not connect to server; are you sure it's running?"
appium在使用inspactor start session时提示:Could not connect to server; are you sure it's running?如下图 解决方案为 ...