通过__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. Android应用安全防护和逆向分析 ——apk混淆成其他语言代码

    现在很多人对于app的安全是越来越重视了,尤其是金融相关的行业,对于app的防范可是下足了功夫.各种加固,各种加密算法,层出不穷.我个人觉得,在安全技术这块,没有绝对安全的.也许今天这个技术起到了防范 ...

  2. CentOS7下 Python2.7.5升级为Python2.7.13

    参考:https://www.jianshu.com/p/fad3942fc0ed 第一步:查看Centos版本及Python版本 • CentOS版本 [root@ tools_package]# ...

  3. webpack快速入门——如何安装webpack及注意事项

    1.window+R键,输入cmd打开命令行工具,输入 mkdir XXXX(XX:文件夹名): 2.cd XXX 进入刚刚创建好的文件夹里,输入cnpm install -g webpack (安装 ...

  4. 汽车检测SIFT+BOW+SVM

    项目来源于 <opencv 3计算机视觉 python语言实现> 整个执行过程如下: 1)获取一个训练数据集. 2)创建BOW训练器并获得视觉词汇. 3)采用词汇训练SVM. 4)尝试对测 ...

  5. 下载apache-tomcat-9.0.17-windows-x64及安装以及用途

    首先我们先去这个网站下载http://www.apache.org/,进入Tomcat,点击Tomcat9 下载64-bit Windows_zip 当我们下载好了之后解压,把多余的文件删除掉,也可以 ...

  6. Vue-Router路由Vue-CLI脚手架和模块化开发 之 使用props替代路由对象的方式获取参数

    在上一章博文中使用路由对象$route获取参数时,组件和路由对象耦合,在这篇博文中就可以使用props来进行解耦: 1.在组件中使用props选项定义数据,接收参数: 2.在路由中,使用props选项 ...

  7. Java之IO(九)其它字节流

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7063161.html 1.前言 之前的章节已经介绍了java的io包中所有成对(输入.输出对应)的字节流,本章介 ...

  8. Spring Security构建Rest服务-0100-前言

    一.我的前言 这是看慕课网老师讲的SpringSecurity的学习笔记,老师讲的很好,开篇就说到了我的心里,老师说道: 有一定经验的程序员如何提升自己? 1,每天都很忙,但是感觉水平没有提升 2,不 ...

  9. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

  10. 【数组】Search for a Range

    题目: Given a sorted array of integers, find the starting and ending position of a given target value. ...