Python面向对象--高级(二)
## 使用__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面向对象--高级(二)的更多相关文章
- Python之路【第十二篇】:Python面向对象高级
一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...
- python 面向对象高级应用(三)
目录: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__getattr__ 二次加工标准类型(包装) __ ...
- Python学习笔记【第十一篇】:Python面向对象高级
isinstance(obj,cls)和issubclass(sub,super) class Person(object): def __init__(self, name, age, sex, n ...
- python面向对象高级:Mixin多重继承
继上一篇学习笔记:python面向对象的继承与多态,本篇就Mixin扩展类的方法写下学习笔记 Mixin Mixin编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是 ...
- python 面向对象高级编程
数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念.
- python - 面向对象(二)
类的三大特性 类的三大特性包括: 封装.继承.多态 一.封装 封装就是将类所用到的所有字段.属性.方法都包含在类代码段里面,当实例调用直接调用类中的方法即可. class People(object) ...
- 17、Python面向对象高级
一.isinstance和issubclass type():不会认为子类实例是一种父类类型: isinstance():认为子类实例是一种父类类型. issubclass():判断是否为其子类. c ...
- #3 Python面向对象(二)
前言 上一节主要记录面向对象编程的思想以及Python类的简单创建,这节继续深入类中变量的相关知识,Here we go! Python中类的各种变量 1.1 类变量 类变量定义:在类中,在函数体(方 ...
- 初学Python——面向对象(二)
一.抽象类.接口类和抽象接口 转自博客园魏恒https://www.cnblogs.com/weihengblog/p/8528967.html (一)接口类 什么是接口类?在继承中,我们可以声明某个 ...
随机推荐
- Win2D 官方文章系列翻译 - 与 Direct2D 互操作
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-interop-with-direct2d/ Win2D 作为 Direct2D 的上层实现,支持与其进行双向 ...
- Sql 本周当天本期日期转换
--查询当天: --查询24小时内的: --info为表名,datetime为数据库中的字段值 --查询当天: --查询24小时内的: select * from table where DateDi ...
- 多ComboBox实现复杂查询
关键是,你是要实现什么功能:是四个条件都有内容时查询,还是哪个内容有查哪个? 如果四个组合框都有内容,相对简单些: string s = "select * from 表名 where 身份 ...
- Spring aop读写分离
一.采用读写分离技术的目标 随着网站的业务不断扩展,数据不断增加,用户越来越多,数据库的压力也就越来越大,采用传统的方式,比如:数据库或者SQL的优化基本已达不到要求,这个时候可以采用读写分离的策略来 ...
- Mac Postman app使用方法
Postman是一种网页调试与发送网页http请求的chrome插件.我们可以用来很方便的模拟get或者post或者其他方式的请求来调试接口.本文是使用的Mac端的app.利用第三方平台LeanClo ...
- Android无需权限显示悬浮窗
TYPE_TOAST一直都可以显示, 但是用TYPE_TOAST显示出来的在2.3上无法接收点击事件, 因此还是无法随意使用. 下面是我之前研究后台线程显示对话框的时候记得笔记, 大家可以看看我们项目 ...
- 心得整理之一--RDLC多数据源多表
我将项目中的一部分提炼出来,写了这个Demo. 先说一下需求, 从 API接口, 获取数据源, 调用RDLC 生成PDF文件. (后面还有涉及到使用福昕PDf阅读器进行设置文件自定义内容,以供外部程序 ...
- ansible使用5-Variables
变量命名 支持数字.字母.下划线 有效:foo_port, foo5 无效:foo-port, foo port, foo.port, 12 playbook定义 - hosts: webserver ...
- Can't connect to any repository.Read timed out after 30,000 ms
解决方法:
- Git入门体验
Git这个东西我也是最近才知道的,然后知道后却发现一个事实:自己真的是太LOW啦!竟然连Git都不知道!!!??? Git 在实际协同工作时会为我们提供巨大帮助, 下面简单介绍一下Git的用法: 一. ...