通过__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中类的约束和限制对象添加属性的更多相关文章

  1. javascript面向对象(给对象添加属性和方法的方式)

    1.在定义对象时,直接把属性和方法添加 <script type="text/JavaScript"> //给对象直接在定义时添加属性和方法         var g ...

  2. Observer(__ob__: Observer) 对象添加属性

    重点通过这句话给对象添加属性: this.$set(r,'upshow',false); 在data中定义laws来装从接口中请求到数据 data(){ return{ laws:[],//法律依据 ...

  3. 275 原型与原型链:显式原型prototype ,隐式原型__proto__,隐式原型链,原型链_属性问题,给原型对象添加属性/方法

    1.所有函数都有一个特别的属性 prototype : 显式原型属性 [普通构造函数的实例对象没有prototype 属性,构造函数有__proto__属性,原型对象有__proto__属性 ] 2. ...

  4. python 学习笔记7(类/对象的属性;特性,__getattr__)

    27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属 ...

  5. prototype为对象添加属性和方法

    可以通过prototype来为已经定义好的的"类"添加属性和方法.这里来了解一下prototype的基础知识.prototype是"构造函数"的属性,不是实例的 ...

  6. js中 给json对象添加属性和json数组添加元素

    js中 给json对象添加新的属性 比如现在有一个json对象为jsonObj,需要给这个对象添加新的属性newParam,同时给newParam赋值为pre.做法如下: var obj={ &quo ...

  7. 关于如何利用原生js动态给一个空对象添加属性以及属性值

    首先,回忆一下,访问对象属性一共有两种方法:点获取法和方括号获取法.而我们最常用的就是点获取法了.但是当我们遇到需要给对象动态添加属性和属性值时,点获取法好像就不太好用了,尤其是我们不知道属性名的时候 ...

  8. 继承:《原型和原型链(prototype 属性使您有能力向对象添加属性和方法。)》

    二. 原型对象   在JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预定义的属性.其中函数对象的一个属性就是原型对象 prototype.注:普通对象没有prototype ...

  9. python - 装饰器+描述符(给类添加属性且属性类型审核)

    装饰器+描述符 实现给一个类添加属性且对添加的时,对属性进行类型审核: def zsq(**kwargs): def fun(obj): for i,j in kwargs.items(): seta ...

随机推荐

  1. [ActionScript 3.0] UDP通信

    package com.controls.socket { import flash.events.DatagramSocketDataEvent; import flash.events.Event ...

  2. Android之AppWidget

    1.Widget设计步骤 需要修改三个XML,一个class: 1)第一个xml是布局XML文件(如:main.xml),是这个widget的.一般来说如果用这个部件显示时间,那就只在这个布局XML中 ...

  3. 【9】JMicro微服务-发布订阅消息服务

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...

  4. JS:事件委托

    事件委托 事件流 事件流描述的是从页面中接收事件的顺序.---JS高级程序设计(第3版) DOM Level 2 Events规定的事件流有三个阶段:①事件捕获阶段.②处于目标阶段.③事件冒泡阶段 事 ...

  5. POJ 1287

    #include<iostream> #include<stdio.h> #define MAXN 100 #define inf 1000000000 using names ...

  6. editplus配置csharp

    只要是写代码的,我们肯定常有用到EditPlus..Net开发也是如此.有时我们需要调试一小段C#(或VB.Net)代码,这时去大动干戈在臃肿的VS.Net中新建“控制台应用程序”项目,写满“Cons ...

  7. LeNet - Python中的卷积神经网络

    本教程将  主要面向代码,  旨在帮助您 深入学习和卷积神经网络.由于这个意图,我  不会花很多时间讨论激活功能,池层或密集/完全连接的层 - 将来会有  很多教程在PyImageSearch博客上将 ...

  8. PHP 修改目录下所有与文件夹重名的前缀文件为index.后缀

    <?phpset_time_limit(0); function traverse($path = '.' , $dir_name='') { $current_dir = opendir($p ...

  9. Vue图片懒加载之lazyload插件使用

    当内容没有加载完的时候,用户体验不是很好,这时候,可以使用lazyload这个插件,提升用户体验,使用方法特别简单易用 一. vue lazyload插件: 插件地址:https://github.c ...

  10. go语言接受者的选取

    何时使用值类型 1.如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型).2.如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存 ...