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)

原文地址:https://www.cnblogs.com/chen55555/p/10284331.html

时间: 2024-10-10 03:32:26

python中类的约束和限制对象添加属性的相关文章

object-c编程tips-给类对象添加属性

此问题来源于网络封装的一个内容,由于保密的问题,我只叙述我业余的一些想法. 基本思想: 网络请求大家应该都会用一个基类的BaseNetWork, 然后由派生类继承于BaseNetWork,并实现一些特殊的方法. 一般标准的流程是传入block, 当网络请求完毕后,通过block回调回来.这里叙述的关键不是如何实现一个网络请求和回调block的相关内容,而是如何取消请求. 一般基类会实现一个cancelNetWork方法,它根据自己的url进行cancel操作. 举例: 我们使用 DerivedN

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

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

prototype为对象添加属性和方法

可以通过prototype来为已经定义好的的"类"添加属性和方法.这里来了解一下prototype的基础知识.prototype是"构造函数"的属性,不是实例的属性. 示例: function HiClass() { this.sayHi = function(){ alert("hi"); } } var obj = new HiClass(); alert(HiClass.prototype);//outputs [object, objec

python 学习笔记7(类/对象的属性)

27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属性中: __dict__ 为字典,键为属性名,值是属性本身. 例子: class bird(object): feather = True # 父类 class chicken(bird): fly = False def __init__(self, age): self.age = age #

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

装饰器+描述符 实现给一个类添加属性且对添加的时,对属性进行类型审核: def zsq(**kwargs): def fun(obj): for i,j in kwargs.items(): setattr(obj,i,mxf(i,j)) return obj return fun class mxf(): def __init__(self,na,ty): self.na = na self.ty = ty def __get__(self, instance, owner): return

VUE关于data对象中数组修改和对象添加属性的响应式问题

数组: 根据VUE官网: 数组修改: 修改数组某个元素的值: Vue.set(this.items, indexOfItem, newValue): this.$set(this.items, indexOfItem, newValue); this.items.splice(indexOfItem, 1, newValue);   修改数组的长度:vm.items.splice(newLength): 对象: 给数组新添加响应式属性: Vue.set(vm.userProfile, 'age'

给对象添加属性和给对象原型添加属性的区别

举个例子: var object = function(){     this.a = 1;     this.b = 2; } 然后new一个对象 var obj1 = new object(); 给对象obj1加一个属性 obj.c = 3: 但是我再var obj2 = new object();这里的obj2并没有c这个属性; 但是我通过原型的方式加属性c: object.prototype.c = 3: 那么我var obj3 = new object(); obj3就有c这个属性

Js 对象添加属性

var arr = new Array(); arr[0] = jQuery("#data1").val(); var obj = {}; obj.y='abc'; arr.push(obj);

iOS 给系统的对象添加额外的属性----关联属性

@interface NSObject (Objc) // @property (nonatomic, strong) NSString *name; // 在分类中 给系统的类添加属性, 一搬系统的类不能添加额外的属性 @end #import "NSObject+Objc.h" #import <objc/message.h> @implementation NSObject (Objc) //static NSString *_name; -(void)setName