## 使用__slots__限制类的属性
  - 之前说到,可以通过在类外部实例或者类名任意定义实例属性或者类属性或者方法

 class Person(object):
pass Person.name = "Stanley" # 在外部添加类属性
print(Person.name) # 输出:Stanley per1 = Person()
per1.age = 22 # 在外部添加实例属性
print(per1.age) # 输出:22 per2 = Person()
# print(per2.age) # 实例属性只由定义该属性的实例所有,其他的实例无法访问 def outer_init(self, name):
self.name = name Person.__init__ = outer_init # 在外部修改类方法
per3 = Person("Lily")
print(per3.name) # 输出:Lily, 说明类方法修改成功

  - 若想要限制实例的属性,可以使用__slots__

 class Person(object):
__slots__ = ("name", "age") # 限制实例属性
count = 1 Person.nationality = "China" # 仍然可以定义类属性
print(Person.nationality) # 输出:China per1 = Person()
per1.name = "Lily"
per1.age = 17 per1.nationality = "China"
# 类属性为只读属性,无法通过实例修改,只能通过类名修改
# AttributeError: 'Person' object attribute 'nationality' is read-only per1.gender = "female"
# 无法通过实例定义新实例属性
# AttributeError: 'Person' object has no attribute 'gender' per1.count = 100
# AttributeError: 'Person' object attribute 'count' is read-only

## 多重继承
  - Python是允许多重继承的,多重继承时代子类拥有多重特征

 class Person(object):
@staticmethod
def pursuit_happiness():
print("幸福是奋斗出来的!") class Father(Person):
character = "温和,坚韧" class Mather(Person):
interest = "阅读,文艺竞技" class Student(Person):
@staticmethod
def do_homework():
print("是学生就要做作业!") class Son(Father, Mather, Student): # 多重继承
pass s = Son()
# Son类实例具有了Father类的属性
print(s.character) # 输出:温和,坚韧
# Son类实例具有了Mather类的属性
print(s.interest) # 输出:阅读,文艺竞技
# Son类实例具有了Student类的方法
s.do_homework() # 输出:是学生就要做作业!
# 由于Father类,Mather类,Student类都各自继承了Person类,所以Son类也有Person类的方法
s.pursuit_happiness() # 输出:幸福是奋斗出来的!

  - 类的组合使用

 class Car(object):
def __init__(self, color, owner):
self.color = color
self.owner = owner class House(object):
def __init__(self, location, owner):
self.location = location
self.owner = owner class Person(object):
def __init__(self, name, car=None, house=None):
self.name = name
self.car = car
self.house = house per1 = Person("Stanley") # 实例化Person
c = Car("Black", per1) # 实例化Car
h = House("China", per1) # 实例化House
per1.car = c # 把实例化的car给per1
per1.house = h # 把实例化的house给per1 # 通过person访问car的属性
print(per1.car.color) # 输出:Black
# 通过person访问house的属性
print(per1.house.location) # 输出:China
# 通过house和car访问person的属性
print(h.owner.name) # 输出:Stanley
print(c.owner.name) # 输出:Stanley

本文参考:

  [美]Bill Lubanovic 《Python语言及其应用》
  https://www.liaoxuefeng.com 廖雪峰的官方网站

Python面向对象--高级(二)的更多相关文章

  1. Python之路【第十二篇】:Python面向对象高级

    一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...

  2. python 面向对象高级应用(三)

    目录: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__getattr__ 二次加工标准类型(包装) __ ...

  3. Python学习笔记【第十一篇】:Python面向对象高级

    isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...

  4. python面向对象高级:Mixin多重继承

    继上一篇学习笔记:python面向对象的继承与多态,本篇就Mixin扩展类的方法写下学习笔记 Mixin Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是 ...

  5. python 面向对象高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念.

  6. python - 面向对象(二)

    类的三大特性 类的三大特性包括: 封装.继承.多态 一.封装 封装就是将类所用到的所有字段.属性.方法都包含在类代码段里面,当实例调用直接调用类中的方法即可. class People(object) ...

  7. 17、Python面向对象高级

    一.isinstance和issubclass type():不会认为子类实例是一种父类类型: isinstance():认为子类实例是一种父类类型. issubclass():判断是否为其子类. c ...

  8. #3 Python面向对象(二)

    前言 上一节主要记录面向对象编程的思想以及Python类的简单创建,这节继续深入类中变量的相关知识,Here we go! Python中类的各种变量 1.1 类变量 类变量定义:在类中,在函数体(方 ...

  9. 初学Python——面向对象(二)

    一.抽象类.接口类和抽象接口 转自博客园魏恒https://www.cnblogs.com/weihengblog/p/8528967.html (一)接口类 什么是接口类?在继承中,我们可以声明某个 ...

随机推荐

  1. hql语句cast用法

    hql中cast为转换函数 cast(a as b);a是要转换的数据,b是目标类型(不是数据库类型名,是hibernate类型名:比如目标类型是varchar,必须写string) eg:selec ...

  2. 在项目引用里添加上对Microsoft Word 11.0 object library的引用

    private void button1_Click(object sender, System.EventArgs e) { //调用打开文件对话框获取要打开的文件WORD文件,RTF文件,文本文件 ...

  3. php session 存储到redis

    PHP 的会话默认是以文件的形式存在的,可以配置到 NoSQL 中,即提高了访问速度,又能很好地实现会话共享,,,爽歪歪! 配置方式如下: 方法一:修改 php.ini 的设置 1 2 session ...

  4. 工作中遇到的vscode配合eslint完成保存为eslint格式

    vscode个人设置 // vscode的个人设置配置 { "workbench.iconTheme": "vscode-icons", "workb ...

  5. C++ Knowledge series Template & Class

    Function Function is composed of name, parameter (operand, type of operand), return value, body with ...

  6. Android中快速实现自定义字体!

    前言:我们都知道,Android中默认的字体是黑体,而大多数app也都是使用的这种字体,但我们发现,大多数app中,个别地方字体非常好看,例如app的标题栏,菜单栏等地方,那他们是怎么做到的呢?有两种 ...

  7. Shader笔记

    1,渲染队列值小的先渲染,值大的后渲染 2,zTest,zWrite zTest:LEqua zWrite:On 则:zWrite中,深度值小于深度值缓冲区的值会被通过 参考:http://www.c ...

  8. 【工作中学习2】Map的使用及排序(第三个参数)

    项目进行中,使用到Map(std::map),Map要点整理如下: 1. Map,也叫关联数组,提供key/value(键/值对),key用来索引,value是被存储和检索的数据. 2. key值唯一 ...

  9. Javascript基础--函数(Function对象)

    1.函数是一段可执行的代码,函数可多次调用,模块化管理. 2.使用function语句,function funName([arg1][,arg2]....[,argn]){代码块}.所有版本可用,一 ...

  10. 搭建日志环境并配置显示DDL语句

    现在一般用log4j用的比较多,用slf4j用的比较少,所有这里我们就不用 hibernate内置的slf4j了. 用到slf的接口,log4j的实现. 要在hibernate中使用log4j,如图所 ...