java常用设计模式精讲_2019最新java设计模式精讲 Debug 方式+内存分析(28章全)

f __set__(self, instance, value):

instance.__dict__[self.name] = value

# Descriptor for enforcing types

class Typed(Descriptor):

expected_type = type(None)

def __set__(self, instance, value):

if not isinstance(value, self.expected_type):

raise TypeError('expected ' + str(self.expected_type))

super().__set__(instance, value)

# Descriptor for enforcing values

class Unsigned(Descriptor):

def __set__(self, instance, value):

if value < 0:

raise ValueError('Expected >= 0')

super().__set__(instance, value)

class MaxSized(Descriptor):

def __init__(self, name=None, **opts):

if 'size' not in opts:

raise TypeError('missing size option')

super().__init__(name, **opts)

def __set__(self, instance, value):

if len(value) >= self.size:

raise ValueError('size must be < ' + str(self.size))

super().__set__(instance, value)

class Integer(Typed):

expected_type = int

class UnsignedInteger(Integer, Unsigned):

pass

class Float(Typed):

expected_type = float

class UnsignedFloat(Float, Unsigned):

pass

class String(Typed):

expected_type = str

class SizedString(String, MaxSized):

pass

# using

# Class decorator to apply constraints

def check_attributes(**kwargs):

def decorate(cls):

for key, value in kwargs.items():

if isinstance(value, Descriptor):

value.name = key

setattr(cls, key, value)

else:

setattr(cls, key, value(key))

return cls

return decorate

# Example

@check_attributes(name=SizedString(size=8),

shares=UnsignedInteger,

price=UnsignedFloat)

class Stock:

# Specify constraints

# name = SizedString('name', size=8)

# shares = UnsignedInteger('shares')

# price = UnsignedFloat('price')

def __init__(self, name, shares, price):

self.name = name

self.shares = shares

self.price = price

if __name__ == "__main__":

s = Stock("boyun", 50, 8.88)

print(s.shares)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

第三种是使用元类

# Base class. Uses a descriptor to set a value

class Descriptor:

def __init__(self, name=None, **opts):

self.name = name

for key, value in opts.items():

setattr(self, key, value)

def __set__(self, instance, value):

instance.__dict__[self.name] = value

# Descriptor for enforcing types

class Typed(Descriptor):

expected_type = type(None)

def __set__(self, instance, value):

if not isinstance(value, self.expected_type):

raise TypeError('expected ' + str(self.expected_type))

super().__set__(instance, value)

# Descriptor for enforcing values

class Unsigned(Descriptor):

def __set__(self, instance, value):

if value < 0:

raise ValueError('Expected >= 0')

super().__set__(instance, value)

class MaxSized(Descriptor):

def __init__(self, name=None, **opts):

if 'size' not in opts:

raise TypeError('missing size option')

super().__init__(name, **opts)

def __set__(self, instance, value):

if len(value) >= self.size:

raise ValueError('size must be < ' + str(self.size))

super().__set__(instance, value)

class Integer(Typed):

expected_type = int

class UnsignedInteger(Integer, Unsigned):

pass

class Float(Typed):

expected_type = float

class UnsignedFloat(Float, Unsigned):

pass

class String(Typed):

expected_type = str

class SizedString(String, MaxSized):

pass

# using

# Class decorator to apply constraints

def check_attributes(**kwargs):

def decorate(cls):

for key, value in kwargs.items():

if isinstance(value, Descriptor):

value.name = key

setattr(cls, key, value)

else:

setattr(cls, key, value(key))

return cls

return decorate

# Example

@check_attributes(name=SizedString(size=8),

shares=UnsignedInteger,

price=UnsignedFloat)

class Stock:

# Specify constraints

# name = SizedString('name', size=8)

# shares = UnsignedInteger('shares')

# price = UnsignedFloat('price')

def __init__(self, name, shares, price):

self.name = name

self.shares = shares

self.price = price

class checkedmeta(type):

def __new__(cls, clsname, bases, methods):

# Attach attribute names to the descriptors

for key, value in methods.items():

if isinstance(value, Descriptor):

value.name = key

return type.__new__(cls, clsname, bases, methods)

# Example

class Stock2(metaclass=checkedmeta):

name = SizedString(size=8)

shares = UnsignedInteger()

price = UnsignedFloat()

def __init__(self, name, shares, price):

self.name = name

self.shares = shares

self.price = price

if __name__ == "__main__":

s = Stock2("boyun", 50, 8.88)

print(s.shares)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

这几种方法中,类装饰器方案是最灵活和最高明的以及最好的。 首先,它并不依赖任何其他新的技术,比如元类。其次,装饰器可以很容易的添加或删除。

装饰器还能作为混入类的替代技术来实现同样的效果

# Base class. Uses a descriptor to set a value

class Descriptor:

def __init__(self, name=None, **opts):

self.name = name

for key, value in opts.items():

setattr(self, key, value)

def __set__(self, instance, value):

instance.__dict__[self.name] = value

# Decorator for applying type checking

def Typed(expected_type, cls=None):

if cls is None:

return lambda cls: Typed(expected_type, cls)

super_set = cls.__set__

def __set__(self, instance, value):

if not isinstance(value, expected_type):

raise TypeError('expected ' + str(expected_type))

super_set(self, instance, value)

cls.__set__ = __set__

return cls

# Decorator for unsigned values

def Unsigned(cls):

super_set = cls.__set__

def __set__(self, instance, value):

if value < 0:

raise ValueError('Expected >= 0')

super_set(self, instance, value)

cls.__set__ = __set__

return cls

# Decorator for allowing sized values

def MaxSized(cls):

super_init = cls.__init__

def __init__(self, name=None, **opts):

if 'size' not in opts:

raise TypeError('missing size option')

super_init(self, name, **opts)

cls.__init__ = __init__

super_set = cls.__set__

def __set__(self, instance, value):

if len(value) >= self.size:

raise ValueError('size must be < ' + str(self.size))

super_set(self, instance, value)

cls.__set__ = __set__

return cls

# Specialized descriptors

@Typed(int)

class Integer(Descriptor):

pass

@Unsigned

class UnsignedInteger(Integer):

pass

@Typed(float)

class Float(Descriptor):

pass

@Unsigned

class UnsignedFloat(Float):

pass

@Typed(str)

class String(Descriptor):

pass

@MaxSized

class SizedString(String):

pass

# Class decorator to apply constraints

def check_attributes(**kwargs):

def decorate(cls):

for key, value in kwargs.items():

if isinstance(value, Descriptor):

value.name = key

setattr(cls, key, value)

else:

setattr(cls, key, value(key))

return cls

---------------------

作者:Allen_by

来源:CSDN

原文:https://blog.csdn.net/boyun58/article/details/85678377

版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值