python中封装,如何在Python中封装?

What's wrong with this? From objective, and functional standpoints?

import sys

class EncapsulationClass(object):

def __init__(self):

self.privates = ["__dict__", "privates", "protected", "a"]

self.protected = ["b"]

print self.privates

self.a = 1

self.b = 2

self.c = 3

pass

def __getattribute__(self, name):

if sys._getframe(1).f_code.co_argcount == 0:

if name in self.privates:

raise Exception("Access to private attribute \"%s\" is not allowed" % name)

else:

return object.__getattribute__(self, name)

else:

return object.__getattribute__(self, name)

def __setattr__(self, name, value):

if sys._getframe(1).f_code.co_argcount == 0:

if name in self.privates:

raise Exception("Setting private attribute \"%s\" is not allowed" % name)

elif name in self.protected:

raise Exception("Setting protected attribute \"%s\" is not allowed" % name)

else:

return object.__setattr__(self, name, value)

else:

return object.__setattr__(self, name, value)

example = EncapsulationClass()

example.a = 10 # Exception: Setting private attribute "a" is not allowed

example.b = 10 # Exception: Setting protected attribute "b" is not allowed

example.c = 10 # example.c == 10

example.__dict__["privates"] # Exception: Setting protected attribute "b" is not allowed

What would actually be wrong with doing something like this?

Is there any better way to achieve encapsulation in Python?

解决方案

Python has encapsulation - you are using it in your class.

What it doesn't have is access control such as private and protected attributes. However, in Python, there is an attribute naming convention to denote private attributes by prefixing the attribute with one or two underscores, e.g:

self._a

self.__a

A single underscore indicates to the user of a class that an attribute should be considered private to the class, and should not be accessed directly.

A double underscore indicates the same, however, Python will mangle the attribute name somewhat to attempt to hide it.

class C(object):

def __init__(self):

self.a = 123 # OK to access directly

self._a = 123 # should be considered private

self.__a = 123 # considered private, name mangled

>>> c = C()

>>> c.a

123

>>> c._a

123

>>> c.__a

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'C' object has no attribute '__a'

>>> c._C__a

123

You can see in the last example that the name was changed from __a to _C__a, although it is still accessible within the class as self.__a.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值