通过__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. Bootstrap框架(二)

    day58 巨幕 这是一个轻量.灵活的组件,它能延伸至整个浏览器视口来展示网站上的关键内容. Hello, world! This is a simple hero unit, a simple ju ...

  2. QQ个人信息保护 | 攻的对面叫防

    近来我们愈来愈重视个人信息保护,当接到骚扰电话时,你心里或许在想(我手机号怎么又被别人知道的?别人是怎么知道我手机号的?),现在的时代,手机已或不可缺,QQ几乎每个人都在用.而有些人总想保护个人QQ资 ...

  3. java的几种定时任务

    本篇博文主要是讲述2.x 版本的quartz下的实现方案,1.x 版本的实现方式大致原理一致,但是具体的实现方式有些不一致,具体体现在获取  scheduler 这个类的方式上有些不同,这里不作过多的 ...

  4. LoadLinked/StoreConditional (LL/SC)

    MIPS中LL/SC指令介绍 MIPS32中的LL.SC指令说明 理解MIPS指令集中的ll (load linked) 和 sc 你用ll指令读取一个内存中的数据并存到一个寄存器,然后在寄存器修改( ...

  5. Sql Sever 2012数据库更名失败 error:5030

    打开SQL Server 2012数据库时,对HzWind_2MW数据库名修改为HzWind_2MW_GEM,结果出现如图1所示: 图1 数据库更名时出现error:5030 数据库不能重名名5030 ...

  6. Delphi获取IdHTTP1.Get(url)的返回参数

    var   ss: TStringStream; begin   ss := TStringStream.Create('');   idHTTP1.get(url, ss);   ss.Positi ...

  7. Python字典按值排序、包含字典的列表按字典值排序的方法

    operator.itemgetter函数 operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),要注意,operator.i ...

  8. (转)MySQL的Grant命令

    [MySQL] - MySQL的Grant命令 来源:http://yingxiong.javaeye.com/blog/451208 本文实例,运行于 MySQL 5.0 及以上版本. MySQL ...

  9. 监督学习——随机梯度下降算法(sgd)和批梯度下降算法(bgd)

    线性回归 首先要明白什么是回归.回归的目的是通过几个已知数据来预测另一个数值型数据的目标值. 假设特征和结果满足线性关系,即满足一个计算公式h(x),这个公式的自变量就是已知的数据x,函数值h(x)就 ...

  10. js前端日期格式化处理

    js前端日期格式化处理 1.项目中时间返回值,很过时候为毫秒值,我们需要转换成 能够看懂的时间的格式: 例如: ​ yyyy-MM-dd HH:mm:ss 2.处理方法(处理方法有多种,可以传值到前端 ...