- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于缺少 const
的争论很多(至少在 SO 上)。 -正确性和缺乏真实性private
Python 中的成员。我正在尝试习惯 Pythonic 的思维方式。
假设我想实现一个油箱。它具有容量,可以重新填充,或者可以消耗掉燃料。所以我会按如下方式实现:
class FuelTank:
def __init__(self, capacity):
if capacity < 0:
raise ValueError("Negative capacity")
self._capacity = capacity
self._level = 0.0
@property
def capacity(self):
return self._capacity
@property
def level(self):
return self._level
def consume(self, amount):
if amount > self.level:
raise ValueError("amount higher than tank level")
self._level -= amount
def refill(self, amount):
if amount + self.level > self.capacity:
raise ValueError("overfilling the tank")
self._level += amount
const
-我的代码中的正确性:不为
capacity
实现属性 setter 我通知客户
capacity
对象构建后无法更改。 (尽管从技术上讲,这总是可以通过直接访问
_capacity
来实现的。)同样,我告诉客户您可以阅读
level
。但请使用
consume
或
refill
改变它的方法。
Car
有一个
FuelTank
:
class Car:
def __init__(self, consumption):
self._consumption = consumption
self._tank = FuelTank(60.0)
@property
def consumption(self):
return self._consumption
def run(self, kms):
required_fuel = kms * self._consumption / 100
if required_fuel > self._tank.level:
raise ValueError("Insufficient fuel to drive %f kilometers" %
kms)
self._tank.consume(required_fuel)
def refill_tank(self, amount):
self._tank.refill(amount)
_tank
直接地。他唯一能想到的就是
refill_tank
.
tank_level
。
def tank_level(self):
return self._tank.level
tank_capacity
很快就会变得有必要,我开始在
Car
中添加包装器方法访问
FuelTank
的所有方法除了
consume
.这显然不是一个可扩展的解决方案。所以,我也可以添加以下
@property
至
Car
@property
def tank(self):
return self._tank
consume
方法不应该被调用。事实上,这个实现只比制作
tank
稍微安全一点。公共(public)属性:
def __init__(self, consumption):
self._consumption = consumption
self.tank = FuelTank(60.0)
Car
中编写包装方法对于FuelTank
的每种方法Car
的客户允许使用(不可扩展且难以维护)。 _tank
(名义上)私有(private)并允许客户端将其作为 getter-only 属性访问。这只能保护我免受可能尝试设置 tank
的过度“白痴”客户端的影响。到一个完全不同的对象。但是,否则不如制作tank
上市。 tank
公开,并询问客户“请不要调用Car.tank.consume
”level
和
capacity
方法
const
在
Tank
类并声明
tank
作为
Car
的私有(private)成员与
get_tank()
返回
const
的方法-引用
tank
.这样,我只需要一个包装方法
refill
,并且我授予客户对任何
const
的完全访问权限
Tank
的成员( future 维护成本为零)。就口味而言,我发现这是 Python 缺乏的一个重要特性。
最佳答案
由于 Python 没有任何标记方法的标准方法 const
,不可能有一种内置的方式来提供一个限制对它们的访问的值(即对象)。然而,有两个习惯用法可以用来提供类似的东西,它们都通过 Python 的动态属性和反射工具变得更容易。
如果要设计一个类来支持这个用例,你可以拆分 它的接口(interface):仅提供“真实”类型的读取接口(interface),然后提供一个提供写入接口(interface)并将任何未知调用转发给读取器的包装器:
class ReadFoo:
def __init__(self): self._bar=1
@property
def bar(self): return self._bar
class Foo:
def __init__(self): self._foo=ReadFoo()
def read(self): return self._foo
def more(self): self._foo._bar+=1
def __getattr__(self,n): return getattr(self._foo,n)
class Big:
def __init__(self): self._foo=Foo()
@property
def foo(self): return self._foo.read()
Foo
不
继承 来自
ReadFoo
; Python 和 C++ 的另一个区别是 Python 不能表达
Base &b=derived;
,所以我们必须使用一个单独的对象。它也不能从一个构造:客户端不能认为他们应该这样做以获得写访问权限。
class ReadList:
def __init__(self,l): self._list=l
def __getattr__(self,n):
if n in ("append","extend","pop",…):
raise AttributeError("method would mutate: "+n)
return getattr(self._list,n)
关于python - const-references 的 Pythonic 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60778937/
标记为家庭作业,因为这是我写的期中问题,但我不明白答案。我被要求在以下语句中解释每个 const 的用途: const char const * const GetName() const { ret
const int* const fun(const int* const& p) const; 我试图弄清楚这个给定函数原型(prototype)的输入参数。我在这两个之间争论,不确定哪个是正确的。
下面的代码用于在同时存在 const 和非 const getter 时减少代码重复。它从非 const 创建 const 版本。我搜索了一下,很多人说我应该从 const 创建非 const 版本。
据我所知,TypeScript 查看了 const string变量作为一个不可变的类型变量,只有那个值,没有其他可能的值。一直以为加as const那是多余的。 为什么我在示例的第二部分得到以下内容
我有一个具有以下签名的方法: size_t advanceToNextRuleEntryRelatedIndex( size_t index, size_t nStrings, char const
首先,有什么区别: (1) const char* (2) char const* (3) const char const* 我相当确定我完全理解这一点,但我希望有人能具体地给我一个句子,这样它就会
这里是新手! 我正在阅读一段代码,我看到作者经常写一个成员函数作为 const int func (const scalar& a) const // etc 你看这里有三个const,现在我明白了中
我总是搞乱如何正确使用 const int*、const int * const 和 int const *。是否有一套规则来定义你可以做什么和不能做什么? 我想知道在赋值、传递给函数等方面所有该做和
我见过人们将 const 用作函数参数的代码。使用 const* 与 const * const 有什么好处?这可能是一个非常基本的问题,但如果有人能解释一下,我将不胜感激。 Bool IsThisN
我总是搞乱如何正确使用 const int*、const int * const 和 int const *。是否有一套规则来定义你可以做什么和不能做什么? 我想知道在赋值、传递给函数等方面所有该做和
这个问题在这里已经有了答案: What is the difference between const int*, const int * const, and int const *? (23 个
如果引用的对象不是 const 对象,那么引用“const”关键字的目的是什么? r1 和 r2 的作用(如下)有什么不同吗? int i = 42; // non const object cons
friend 让我解释原因 const const const const const int const i = 0; 是有效的语法。我拒绝对这个话题有任何想法。虽然我很好奇它是否只是语法问题? 编
我总是搞砸如何正确使用 const int*、const int * const 和 int const *。是否有一套规则来定义你能做什么和不能做什么? 我想知道在分配、传递给函数等方面的所有注意事
常量在 const char* push(const char * const &&_data); 表示无法更改引用的内容。为什么我不能将 const char* 传递给 push? 最佳答案 您的代
我有一个关于在函数参数中涉及指针的最佳实践以及它们是否应该指定为 *const 的问题或 const *const .我知道对于 const 的使用或过度使用存在不同的意见。 ,但至少有一些用途是捕捉
我目前正在为我的类(class)写一个作业,它应该充当一个非常基本的外壳。我快完成了,但是我遇到了 execvp 和我的参数字符数组的问题。这是我的代码的一小段。 //Split the left c
所以,我知道了char const *、char * const 和char const * const 之间的区别。那些是: char* the_string : I can change the
我正在运行一些示例程序以重新熟悉 C++,我遇到了以下问题。首先,这里是示例代码: void print_string(const char * the_string) { cout << t
我正在为系统中的编译错误而苦苦挣扎,这是代码 struct Strless : public binary_function { public : bool operator()(cons
我是一名优秀的程序员,十分优秀!