绑定方法两种:

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 继承的更多相关文章

  1. 2.java面向对象类与类/类与对象之间关系详解

    继承.实现.依赖.关联.聚合.组合的联系与区别 下面的内容很基础,同时也很简单,但是也很重要. 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功 ...

  2. Spring IOC、对象依赖关系

    Spring IOC.对象依赖关系   2016-09-21 01:36 414人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 引入 Strut ...

  3. Python学习day24-面向对象的三大特征之继承

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. O-C相关-06:对象与对象的关系

    对象与对象的关系 1.对象与对象的关系 依赖 关联 组合 常常讨论对象与对象关系时会提供两个属于:内聚性,耦合性 内聚一般指功能上的指向性 耦合一般指关联上的依赖性 2.依赖: 对象之间最弱的一种关联 ...

  5. 浅谈python的对象的三大特性之继承

    前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间. 现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性. 前面定义了一个人的类,可是我们还知道,人 ...

  6. 在SQL Server中查看对象依赖关系

    原文 在SQL Server中查看对象依赖关系 Viewing object dependencies in SQL Server   Deleting or changing objects may ...

  7. php课程 11-37 类和对象的关系是什么

    php课程 11-37 类和对象的关系是什么 一.总结 一句话总结:类生成对象,对象是类的实例化,一定是先有类,后有对象,一定是先有标准,再有个体. 1.oop的三大优势是什么? 重用性,灵活性.扩展 ...

  8. Unity3D热更新之LuaFramework篇[07]--怎么让unity对象绑定Lua脚本

    前言 在上一篇文章 Unity3D热更新之LuaFramework篇[06]--Lua中是怎么实现脚本生命周期的 中,我分析了由LuaBehaviour来实现lua脚本生命周期的方法. 但在实际使用中 ...

  9. 自学Python5.5-面向对象三大基本特征_继承

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

随机推荐

  1. WPF教程十二:了解自定义控件的基础和自定义无外观控件

    这一篇本来想先写风格主题,主题切换.自定义配套的样式.但是最近加班.搬家.新租的房子打扫卫生,我家宝宝6月中旬要出生协调各种的事情,导致了最近精神状态不是很好,又没有看到我比较喜欢的主题风格去模仿的, ...

  2. oracle 大表在线删除列操作(alter table table_name set unused )

    在某些情况下业务建的表某些列没有用到,需要进行删除,但是如果是数据量很大的大表,直接 alter table table_name drop column column_name;这种方法删除,那么将 ...

  3. 【BZOJ 4771】七彩树

    一直TLE的原因竟然是数组开太大了导致\(memset\)清空耗时超限,亏我还调了1天啊(T^T) 题目大意 给定一颗树,每个节点都有一个颜色,要求多次询问某个节点\(x\)的子树中深度不超过\(d\ ...

  4. C语言:Unicode字符集

    Unicode 也称为统一码.万国码:看名字就知道,Unicode 希望统一所有国家的字符编码.Unicode 于 1994 年正式公布第一个版本,现在的规模可以容纳 100 多万个符号,是一个很大的 ...

  5. POJ 博弈论

    poj1704 Georgia and Bob 题目链接:http://poj.org/problem?id=1704 题意:如图所示,两个人在玩一个游戏,排成直线的格子上有n个棋子,两人依次将棋子向 ...

  6. K8s基本概念资料

    https://www.cnblogs.com/menkeyi/p/7134460.html

  7. 微信小程序云开发-数据库-商品列表数据排序

    一.wxml添加升序和降序 在商品列表的wxml文件中添加超链接a标签,分别用于升序和降序的点击.分别绑定升序和降序的点击事件. 二.js文件实现升序和降序 分别写对应的按价格升序函数sortByPr ...

  8. [HNOI2008]GT考试 题解

    这题比较难搞.考虑设计状态:\(f_{i,j}\) 表示当前考虑到 \(X_i\) 位,且 \(X\) 的后 \(j\) 位刚好与 \(A\) 列匹配时的方案数.最终答案为 \(\sum_{i=0}^ ...

  9. fatal error: all goroutines are asleep - deadlock!

    一.问题截图 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: main.main() /U ...

  10. BOM(Bill of Material)物料清单基础知识(一)

                                                                                            一.BOM的基础概念 概 ...