对象 绑定关系 隐藏属性 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 ...
随机推荐
- c++ 进制转换源代码
#include<stdio.h> int main() { char ku[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C ...
- c++中的对象模型
1 对象模型的前世 类在c++编译器内部可以理解成结构体,所以在对象模型分析时,我们可以把 class 当作一种特殊的 struct: 1)在内存中 class 可以看作是普通成员变量的集合: 2) ...
- SpringBoot 整合 MybatisPlus 3.0
CRUD是指在做计算处理时的增加(Create).读取查询(Retrieve).更新(Update)和删除(Delete)几个单词的首字母简写.主要被用在描述软件系统中DataBase或者持久层的 ...
- Day12 抽象类、接口、内部类-面向对象编程(3)
抽象类 abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类: 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类. ...
- python -- 程序结构
一.程序结构 • 定义python文件的头部模板:在File->Settings->Editor->File and Code Templates->Python script ...
- 架构之:REST和HATEOAS
目录 简介 HATEOAS简介 HATEOAS的格式 HATEOAS的Spring支持 总结 简介 我们知道REST是一种架构方式,它只是指定了六种需要遵循的基本原则,但是它指定的原则都比较宽泛,我们 ...
- PAT乙级:1090危险品装箱(25分)
PAT乙级:1090危险品装箱(25分) 题干 集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清 ...
- 【洛谷1339 [USACO09OCT]】热浪Heat Wave 图论+最短路
AC代码 #include<bits/stdc++.h> using namespace std; const int MAXN=62000+10,INF=999999; struct E ...
- 前端基础EL表达式(八)
一.什么是EL表达式? 1.什么是EL表达式? EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言, ...
- Python基础之tabview
以前写过界面,但是没有记录下来,以至于现在得从头学习一次,论做好笔记的重要性. 现在学习的是怎么写一个tabview出来,也就是用tkinter做一个界面切换的效果.参考链接:https://blog ...