## 使用__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. [巩固C#] 二、什么是反射、反射可以做些什么

      阅读目录   关闭   什么是反射,反射能干嘛? 获取类型的相关信息 获取类型本身信息(命名空间名.全名.是否是抽象.是否是类..... 获取类型成员信息(通过Tyep中的方法GetMembers ...

  2. 如何解读IL代码

    如何解读IL代码 关于IL代码,我有将从三个方面去揭开它神秘的面纱.IL代码是什么?我们为什么要去读懂IL代码?我们如何去读懂IL代码?这三个问题的解答,将是我解读IL代码的整体思路. IL代码是什么 ...

  3. EF的注解Annotation和Fluent API

    注意:Annotation特性标记可组合使用,也就是在一个类或属性上可以附加多个annotations特性 一.常用注解和对应的Fluent API 1.[Required]              ...

  4. Socket网络通信之NIO

    Socket网络通信之NIO NIO:new io ,java1.4开始推出的可非阻塞IO. java.nio 包,可解决BIO阻塞的不足 但比BIO学习.使用复杂. 可以以阻塞.非阻塞两种方式工作. ...

  5. hdu 3586 最小代价切断根与叶子联系

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 http://blog.csdn.net/woshi250hua/article/details ...

  6. JS判断web网站访问端是PC电脑还是手机

    通过JS语句判断WEB网站的访问端是电脑还是手机,以显示不同的页面! <script type="text/javascript"> <!-- //平台.设备和操 ...

  7. 基于百度ai,图灵机器人,Flask 实现的网站语音智能问答

    准备以下模块中的函数 from aip import AipSpeech import time import os import requests APP_ID = '15420654' API_K ...

  8. #include stdio.h(3)

    #include <stdio.h> int main() { /* * ** *** **** ***** */ ;a<;a++) { printf("\n") ...

  9. JS的函数参数传递为值传递

    function setAge(i) { alert(i);//24 i = 18; alert(i);//18,i的改变不会影响外面的age }; var age = 24; setAge(age) ...

  10. 使用BaiDu Java Script Web Api 在Web开发中嵌入地图使用步骤

    前言 很多做企业网站的朋友,都喜欢有一个关于我们.联系我们的栏目,那么这个栏目放什么内容才能饱满那,只有放个地图才显得有点高大上. 一.产生并复制访问Api的密钥(AK) 1.首先我们需要注册一个百度 ...