通过__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. POST 400 (BAD REQUEST)

    遇到这种错,1,F12打开控制台,2,点击network,找到发送的请求. 3,点击请求,4,看右侧的 Header Preview Response 应该能找到原因. 就拿刚才来说,找了好几个小时原 ...

  2. GitHub项目加入Travis-CI的自动集成

    Travis-CI是为github量身打造的自动集成环境,如果我们的项目托管在github上,可以十分方便的使用Travis-CI做自动集成. 使用Travis-CI十分的简单,首先打开Travis- ...

  3. 微信小程序组件化实践

    Do Not Repeat Yourself 如何提高代码质量,方法有许多:抽象.模块.组件化,我认为它们的中心点都是--Do Not Repeat Yourself. 小程序组件化 我们先看看小程序 ...

  4. scroll事件实现监控滚动条改变标题栏背景透明度(zepto.js )

    今天做了一个类似于手机端京东首页的页面,效果图如下: 刷新页面的时候,标题栏(也就是搜索栏),背景是透明的,当我们往下滑的时候,可以改变标题栏的背景透明度(渐变效果): 当标题栏滑过轮播图后,透明度就 ...

  5. Spring中AOP切面编程学习笔记

    注解方式实现aop我们主要分为如下几个步骤: 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类. 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对 ...

  6. centos安装 Anaconda3及使用

    下载安装 下载地址https://www.anaconda.com/download/ 旧版本下载https://repo.continuum.io/archive/ 比如下载Anaconda3-4. ...

  7. Vim编辑器与shell脚本

      目录                                                          Vim文本编辑器 Shell脚本 Shell编程变量 流程控制语句 计划任务 ...

  8. POJ 1111

    #include<iostream> #define MAXN 30 using namespace std; char _m[MAXN][MAXN]; bool mark[MAXN][M ...

  9. jq01--概述

    jq:jQuery,是一个JavaScript函数库,为了简化js开发与编码而封装的js库,是一个“写得更少,做得更多”的js函数库,为事件处理而特别设计的.现在我们来学习一下它. 1.jq库:为事件 ...

  10. mysql互为主从实战设置详解及自动化备份(Centos7.2)

    mysql互为主从实战设置详解(Centos7.2) 第一步:mysql配置  my.cnf配置 服务器1 (10.89.10.90) [mysqld]  server-id=1  log-bin=/ ...