我想了解内置函数的property
工作原理.令我困惑的是,property
它也可以用作装饰器,但它只在用作内置函数时才需要参数,而不是用作装饰器时.
这个例子来自文档:
class C(object):
def __init__(self):
self._x = None
def getx(self):
return self._x
def setx(self, value):
self._x = value
def delx(self):
del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
Run Code Online (Sandbox Code Playgroud)
property
的论点是getx
,setx
,delx
和文档字符串.
在下面的代码中property
用作装饰器.它的对象是x
函数,但在上面的代码中,参数中没有对象函数的位置.
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
Run Code Online (Sandbox Code Playgroud)
而且,如何在 …
python properties decorator python-internals python-decorators
我目前正在开发一个简单的Java游戏,有几种不同的模式.我扩展了一个主要的Game类,将主要逻辑放在其他类中.尽管如此,主要的游戏类仍然非常沉重.
在快速浏览一下我的代码后,其中大部分是Getters and Setters(60%),而其余部分则是游戏逻辑真正需要的.
一些谷歌搜索声称Getters和Setters是邪恶的,而其他人声称他们是良好的OO练习和伟大的程序所必需的.
所以我该怎么做?应该是哪个?我应该为我的私人变量更改我的Getters和Setter,还是应该坚持使用它们?
如果你在enum api中查看方法,name()
它会说:
返回此枚举常量的名称,与其枚举声明中声明的完全相同.大多数程序员应优先使用toString方法,因为toString方法可能会返回一个更加用户友好的名称.此方法主要用于特殊情况,其中正确性取决于获取确切名称,该名称在不同版本之间不会有所不同.
为什么更好用toString()
?我的意思是当name()已经是final时,可以覆盖toString.因此,如果您使用toString并且有人覆盖它以返回硬编码值,则整个应用程序都会关闭...另外,如果您查看源代码,则toString()方法将返回完全正确的名称.这是同一件事.
我想知道那些getter和setter声明之间的区别是什么,以及是否有一个首选方法(以及为什么).第一个可以由Visual Studio自动生成.其他人怎么样?谢谢
1
string _myProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)
第2
string _myProperty;
public string myProperty
{
get { return _myProperty; }
set { _myProperty = value; }
}
Run Code Online (Sandbox Code Playgroud)
第3
string _myProperty;
public string getMyProperty()
{
return this._myProperty;
}
public void setMyProperty(string value)
{
this._myProperty = value;
}
Run Code Online (Sandbox Code Playgroud) 我对ECMAScript 6类中getter和setter的重点感到困惑.什么目的?以下是我所指的一个例子:
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
return this._name.toUpperCase();
}
set name(newName){
if(newName){
this._name = newName;
}
}
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么要使用getter和setter?
我已阅读的书Java
,说这是好事,创建getter和setter方法的变量,如x
和y
.例如:
public int getX(){
return x;
}
public void setX(int x){
this.x = x;
}
Run Code Online (Sandbox Code Playgroud)
但与此有什么不同
...(shape.x)... // basically getX()
Run Code Online (Sandbox Code Playgroud)
和
shape.x = 90; // basically setX()
Run Code Online (Sandbox Code Playgroud)
如果选手和吸气器更好,你能解释一下会出现什么样的实际问题吗?
作为一个相当绿色的Java编码器,我为自己设置了一个尝试编写简单文本冒险的巨大挑战.不出所料,我已经遇到了困难!
我正在尝试为我的Location类提供一个属性来存储它包含的出口.我为此使用了一个布尔数组,基本上保存表示每个出口的true/false值.我并不完全相信
a)这是最有效的方法
b)我正在使用正确的代码来填充数组.
我会很感激任何和所有的反馈,即使它是一个完整的代码超载!
目前,在实例化一个Location时,我会生成一个String,我将其发送到setExits方法:
String e = "N S U";
secretRoom.setExits(e);
Run Code Online (Sandbox Code Playgroud)
在Location类中,setExits如下所示:
public void setExits(String e) {
if (e.contains("N"))
bexits[0] = true;
else if (e.contains("W"))
bexits[1] = true;
else if (e.contains("S"))
bexits[2] = true;
else if (e.contains("E"))
bexits[3] = true;
else if (e.contains("U"))
bexits[4] = true;
else if (e.contains("D"))
bexits[5] = true;
}
Run Code Online (Sandbox Code Playgroud)
我会说实话,我认为这看起来特别笨重,但我想不出另一种方法.我现在还不完全确定如何编写getExits方法......
欢迎任何帮助!
我一直在努力创建一个课程,突然想到了两个代码之间有什么区别:
public readonly string ProductLocation;
Run Code Online (Sandbox Code Playgroud)
和
public string ProductLocation
{
get;
private set;
}
Run Code Online (Sandbox Code Playgroud)
你能告诉我什么时候更好地使用以下内容吗?谢谢.
Allen Holub写了以下内容,
如果没有一些耦合,你就无法拥有一个程序.尽管如此,您可以通过盲目地遵循OO(面向对象的)规则来最大限度地减少耦合(最重要的是对象的实现应该完全隐藏在使用它的对象之外).例如,对象的实例变量(非常量的成员字段)应始终为私有.期.没有例外.永远.我是认真的.(您可以偶尔有效地使用受保护的方法,但受保护的实例变量是令人厌恶的.)
这听起来很合理,但他继续说,
你不应该出于同样的原因使用get/set函数 - 它们只是过于复杂的方式使字段公开(尽管返回完整对象而不是基本类型值的访问函数在返回对象的情况下是合理的class是设计中的关键抽象).
坦率地说,这对我来说听起来很疯狂.
我理解信息隐藏的原理,但是如果没有访问器和更改器,你根本就不能使用Java bean.我不知道如何在模型中没有访问器的情况下遵循MVC设计,因为模型不能负责渲染视图.
但是,我是一名年轻的程序员,而且我每天都在学习更多关于面向对象设计的知识.也许拥有更多经验的人可以在这个问题上权衡.
getter ×4
java ×4
setter ×4
c# ×2
oop ×2
.net ×1
accessor ×1
arrays ×1
class ×1
decorator ×1
ecmascript-6 ×1
enums ×1
immutability ×1
properties ×1
python ×1
readonly ×1
unit-testing ×1