python中类的约束和限制对象添加属性
通过__slots__限制对象可添加的属性
class A:
__slots__ = ['a', 'b']
pass a1 = A()
a1.a = 10
print(a1.a)
a1.c = 0 # 只能添加a,b属性添加其他属性就报错
没有约束
class Alipay:
def pay(self, money):
print('此次消费%s' % money) class QQpay:
def pay(self, money):
print('此次消费%s' % money) def pay(obj, money):
obj.pay(money)
弱约束
class Pay: # 弱约束
def pay(self, money):
pass class Alipay(Pay):
def pay(self, money):
print('此次消费%s' % money) class QQpay(Pay):
def pay(self, money):
print('此次消费%s' % money) class Wechatpay(Pay):
def fuqian(self, money): # 不规范,不报错
print('此次消费%s' % money) # class Wechatpay:
# def pay(self, money): # 规范统一
# print('此次消费%s' % money) def pay(obj, money):
obj.pay(money) a1 = Alipay()
q1 = QQpay()
c1 = Wechatpay()
# a1.pay(100)
# q1.pay(200) pay(a1, 100)
pay(q1, 200)
pay(c1, 300)
强制约束
方法一、若不实现父类方法主动主动抛出异常进行约束
# 这个父类制定了一个约束,规范,子类一定要有pay方法。
class Pay:
def pay(self, money): # 主动抛异常
raise Exception('未定义pay方法') class Alipay(Pay):
def pay(self, money):
print('此次消费%s' % money) class QQpay(Pay):
def pay(self, money):
print('此次消费%s' % money) class Wechatpay:
def pay(self, money):
print('此次消费%s' % money) class Unitypay(Pay):
def fuqian(self, money): # 没实现父类方法
print('此次消费%s' % money) def pay(obj, money): # 归一化设计
obj.pay(money) a1 = Alipay()
q1 = QQpay()
c1 = Wechatpay()
d1 = Unitypay()
# a1.pay(100)
# q1.pay(200) # pay(a1, 100)
# pay(q1, 200)
# pay(c1, 300)
pay(d1, 200) # 没实现父类方法在此处抛异常
方法二、利用模块,如果子类不实现父类方法在实例化时就报错
from abc import abstractmethod
from abc import ABCMeta class Pay(metaclass=ABCMeta): # 抽象类,在实例化就报错
@abstractmethod # 定一个约束,规范,约束子类中一定要有pay方法
def pay(self, money):
pass class Alipay(Pay):
def pay(self, money):
print('此次消费%s' % money) class QQpay(Pay):
def pay(self, money):
print('此次消费%s' % money) class Wechatpay:
def pay(self, money):
print('此次消费%s' % money) class Unitypay(Pay):
def fuqian(self, money): # 没实现父类方法
print('此次消费%s' % money) def pay(obj, money):
obj.pay(money) a1 = Alipay()
q1 = QQpay()
c1 = Wechatpay()
d1 = Unitypay() # 没实现父类方法,实例化时就报错
# a1.pay(100)
# q1.pay(200) # pay(a1, 100)
# pay(q1, 200)
# pay(c1, 300)
pay(d1, 200)
python中类的约束和限制对象添加属性的更多相关文章
- javascript面向对象(给对象添加属性和方法的方式)
1.在定义对象时,直接把属性和方法添加 <script type="text/JavaScript"> //给对象直接在定义时添加属性和方法 var g ...
- Observer(__ob__: Observer) 对象添加属性
重点通过这句话给对象添加属性: this.$set(r,'upshow',false); 在data中定义laws来装从接口中请求到数据 data(){ return{ laws:[],//法律依据 ...
- 275 原型与原型链:显式原型prototype ,隐式原型__proto__,隐式原型链,原型链_属性问题,给原型对象添加属性/方法
1.所有函数都有一个特别的属性 prototype : 显式原型属性 [普通构造函数的实例对象没有prototype 属性,构造函数有__proto__属性,原型对象有__proto__属性 ] 2. ...
- python 学习笔记7(类/对象的属性;特性,__getattr__)
27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属 ...
- prototype为对象添加属性和方法
可以通过prototype来为已经定义好的的"类"添加属性和方法.这里来了解一下prototype的基础知识.prototype是"构造函数"的属性,不是实例的 ...
- js中 给json对象添加属性和json数组添加元素
js中 给json对象添加新的属性 比如现在有一个json对象为jsonObj,需要给这个对象添加新的属性newParam,同时给newParam赋值为pre.做法如下: var obj={ &quo ...
- 关于如何利用原生js动态给一个空对象添加属性以及属性值
首先,回忆一下,访问对象属性一共有两种方法:点获取法和方括号获取法.而我们最常用的就是点获取法了.但是当我们遇到需要给对象动态添加属性和属性值时,点获取法好像就不太好用了,尤其是我们不知道属性名的时候 ...
- 继承:《原型和原型链(prototype 属性使您有能力向对象添加属性和方法。)》
二. 原型对象 在JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预定义的属性.其中函数对象的一个属性就是原型对象 prototype.注:普通对象没有prototype ...
- python - 装饰器+描述符(给类添加属性且属性类型审核)
装饰器+描述符 实现给一个类添加属性且对添加的时,对属性进行类型审核: def zsq(**kwargs): def fun(obj): for i,j in kwargs.items(): seta ...
随机推荐
- [ActionScript 3.0] UDP通信
package com.controls.socket { import flash.events.DatagramSocketDataEvent; import flash.events.Event ...
- Android之AppWidget
1.Widget设计步骤 需要修改三个XML,一个class: 1)第一个xml是布局XML文件(如:main.xml),是这个widget的.一般来说如果用这个部件显示时间,那就只在这个布局XML中 ...
- 【9】JMicro微服务-发布订阅消息服务
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...
- JS:事件委托
事件委托 事件流 事件流描述的是从页面中接收事件的顺序.---JS高级程序设计(第3版) DOM Level 2 Events规定的事件流有三个阶段:①事件捕获阶段.②处于目标阶段.③事件冒泡阶段 事 ...
- POJ 1287
#include<iostream> #include<stdio.h> #define MAXN 100 #define inf 1000000000 using names ...
- editplus配置csharp
只要是写代码的,我们肯定常有用到EditPlus..Net开发也是如此.有时我们需要调试一小段C#(或VB.Net)代码,这时去大动干戈在臃肿的VS.Net中新建“控制台应用程序”项目,写满“Cons ...
- LeNet - Python中的卷积神经网络
本教程将 主要面向代码, 旨在帮助您 深入学习和卷积神经网络.由于这个意图,我 不会花很多时间讨论激活功能,池层或密集/完全连接的层 - 将来会有 很多教程在PyImageSearch博客上将 ...
- PHP 修改目录下所有与文件夹重名的前缀文件为index.后缀
<?phpset_time_limit(0); function traverse($path = '.' , $dir_name='') { $current_dir = opendir($p ...
- Vue图片懒加载之lazyload插件使用
当内容没有加载完的时候,用户体验不是很好,这时候,可以使用lazyload这个插件,提升用户体验,使用方法特别简单易用 一. vue lazyload插件: 插件地址:https://github.c ...
- go语言接受者的选取
何时使用值类型 1.如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型).2.如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存 ...