__init __()应该致电父母级的__init __()吗?

我在Objective-C中使用了此结构: - (void)init { if (self = [super init]) { // init class } return self; } 也应该Python调用父类的实现__init__? class NewClass(SomeOtherClass): def __init__(self): SomeOtherClass.__init__(self) # init class 这也是对的还是错误的__new__()和__del__()? Edit: 有一个非常相似的问题:继承和覆盖__init__在Python 答案 在Python中,称为超级班级__init__是可选的。如果您称其为super标识符,或者是否显式命名超类: object.__init__(self) 在对象的情况下,由于超级方法是空的,因此调用超级方法不是严格必要的。相同__del__。 另一方面,对于__new__,你确实应该调用 super 方法,并使用它的返回作为新创建的对象 - 除非你明确想要返回不同的东西。 来自: stackoverflow.com

__init__和__call__有什么区别?

我想知道__init__和__call__方法。 例如: class test: def __init__(self): self.a = 10 def __call__(self): b = 20 答案 第一个用于初始化新创建的对象,并收到用于这样做的参数: class Foo: def __init__(self, a, b, c): # ... x = Foo(1, 2, 3) # __init__ 第二个实现函数调用运算符。 class Foo: def __call__(self, a, b, c): # ... x = Foo() x(1, 2, 3) # __call__ 来自: stackoverflow.com

.h 和 .cpp 文件中的默认参数

COMPILER: g 4.7.2 好的。.h和.cpp文件。 test1.h #pragma once #include <iostream> using namespace std; class Class{ public: Class(int, int, int=1); }; test1.cpp #include "test1.h" Class::Class(int a, int b=2, int c) { cout<<a<<" "<<b<<" "<<c<<endl; } int main() { Class a(1); return 0; } 现在,根据我的测试,可以添加默认参数.cpp文件。 默认参数存在于.cpp和.h文件不应重叠。 Class(a, b, c=1)(在 .h 文件中)和Class::Class(a,b,c=2)(在 .cpp 文件中)无效。 众所周知的规则是,一旦添加了默认参数,之后声明的所有变量也必须包含默认值。德帕拉规则。 函数声明中声明的变量(.h文件)应遵守德帕拉 规则,即Class(a, b=2, c)无论 .cpp 文件中声明了什么,(在 .h 文件中)都是无效的。 如果认为变量具有默认值(作为默认值的交集).h和.cpp文件),它将遵循德帕拉 规则。 Class(a, b, c=1)(在 .h 文件中)和Class::Class(a,b=2,c)( 在.cpp文件)有效。Class(a, b, c=1)(在 .h 文件中)和Class::Class(a=2,b,c)( 在....

“低耦合、高内聚”是什么意思

我无法理解该声明low in coupling and high in cohesion。 据我了解是High cohesion意味着我们应该拥有专门执行特定功能的类。 还是不明白低耦合是什么意思? 答案 我相信的是: 内聚性是指模块/类的元素所属的程度,建议相关代码应该彼此靠近,因此我们应该争取高内聚性,将所有相关代码尽可能紧密地绑定在一起。within模块/类。 耦合是指不同模块/类之间的依赖程度,建议所有模块尽可能独立,这就是低耦合的原因。among不同的模块/类。 可视化整个图片会很有帮助: 截图取自Coursera。 来自: stackoverflow.com

“对接口进行编程”是什么意思?

我已经多次看到这句话,但我不清楚这是什么意思。 我知道接口的作用,但事实上我对此并不清楚,这让我觉得我错过了正确使用它们的机会。 如果你这样做是不是就是这样: IInterface classRef = new ObjectWhatever() 您可以使用任何实现的类IInterface?IInterface。 另外,如何编写一个接受实现接口的对象的方法? 答案 对于这个问题,这里有一些精彩的答案,其中涉及到有关接口、松散耦合代码、控制反转等的各种详细信息。 当我第一次开始接触接口,我也困惑他们的相关性。较弱继承和思考的形式,“何必呢?” 例如,假设您有一个 SIM 游戏并具有以下类: class HouseFly inherits Insect { void FlyAroundYourHead(){} void LandOnThings(){} } class Telemarketer inherits Person { void CallDuringDinner(){} void ContinueTalkingWhenYouSayNo(){} } 显然,这两个对象在直接继承方面没有任何共同点。 假设我们的游戏需要某种随机性事物 这会让玩家在吃晚饭时感到烦恼。HouseFly或一个Telemarketer或者两者兼而有之——但是如何通过一个函数同时实现这两种功能呢? 认识到的关键是,两者Telemarketer和HouseFly尽管它们在建模方面毫无相似之处,但它们具有共同的松散解释行为。 interface IPest { void BeAnnoying(); } class HouseFly inherits Insect implements IPest { void FlyAroundYourHead(){} void LandOnThings(){} void BeAnnoying() { FlyAroundYourHead(); LandOnThings(); } } class Telemarketer inherits Person implements IPest { void CallDuringDinner(){} void ContinueTalkingWhenYouSayNo(){} void BeAnnoying() { CallDuringDinner(); ContinueTalkingWhenYouSayNo(); } } 我们现在有两个类,每个类都以自己的方式令人讨厌。IPest——那个合同很简单。BeAnnoying。...

“界面的程序,而不是实现”是什么意思?

人们在阅读设计模式时偶然发现了这句话。 但是我不明白,有人可以为我解释一下吗? 答案 Interfaces are just contracts or signatures and they don’t know anything about implementations. 针对接口表示的编码,客户端代码始终保存由工厂提供的接口对象。工厂返回的任何实例都是任何工厂候选类都必须实现的类型接口。这样,客户端程序就不必担心实施,接口签名确定可以完成所有操作。这可以用于在运行时更改程序的行为。它还可以帮助您从维护的角度编写更好的程序。 这是您的基本示例。 public enum Language { English, German, Spanish } public class SpeakerFactory { public static ISpeaker CreateSpeaker(Language language) { switch (language) { case Language.English: return new EnglishSpeaker(); case Language.German: return new GermanSpeaker(); case Language.Spanish: return new SpanishSpeaker(); default: throw new ApplicationException("No speaker can speak such language"); } } } [STAThread] static void Main() { //This is your client code....

“静态”关键字在班上有什么作用?

具体来说,我正在尝试此代码: package hello; public class Hello { Clock clock = new Clock(); public static void main(String args[]) { clock.sayTime(); } } 但这给了错误 无法在静态方法中访问非静态字段 所以我改变了声明clock因此: static Clock clock = new Clock(); 它起作用了。将关键字放在声明之前是什么意思?它到底会做什么和/或限制该对象? 答案 static成员属于类而不是特定实例。 代表着只有一个实例static现场存在 ^[1]^即使您创建了一百万个班级的实例,或者您没有创建任何实例。所有情况都将共享。 自从static方法也不属于特定实例,他们不能参考实例成员。在给出的示例中,main不知道哪个实例Hello班级(因此Clock班级)应该参考。static成员只能参考static成员。实例成员当然可以访问static成员。 边注: 当然,static成员可以访问实例成员通过对象参考。 例子: public class Example { private static boolean staticField; private boolean instanceField; public static void main(String[] args) { // a static method can access static fields staticField = true; // a static method can access instance fields through an object reference Example instance = new Example(); instance....

“自我”一词的目的是什么?

目的是什么self在python?我知道它是指从该类创建的特定对象实例。但是,为什么每种方法都需要将其明确添加为参数呢? 为了说明,在Ruby中,我可以做到这一点: class MyClass def func(name) @name = name end end 但是,在Python中,我需要包括self: class MyClass: def func(self, name): self.name = name 答案 您需要使用的原因self.是因为Python不使用@语法要参考实例属性。Python决定以使该方法属于的实例的方式进行方法通过 自动,但不是已收到 自动:方法的第一个参数是调用方法的实例。这使方法与函数完全相同,并将实际名称留给您(尽管self是惯例,当您使用其他东西时,人们通常会皱眉。)self对于代码并不特别,它只是另一个对象。 Python本可以做其他事情以将正常名称与属性区分开 - 像Ruby一样的特殊语法,或者需要C ++和Java之类的声明,或者可能更不同 - 但事实并非如此。Python的全部是使事物明确的,使它显而易见,尽管它并不完全在任何地方做到这一点,但它确实做到了,例如属性。这就是为什么分配给实例属性需要知道要分配的实例的原因,这就是为什么它需要self.。 来自: stackoverflow.com

@ClassMethod和@staticmethod的含义?

有人可以向我解释@classmethod和@staticmethod在python?我需要知道差异和含义。 据我所理解,@classmethod告诉一个类,这是一种应继承为子类或…某物的方法。但是,这有什么意义呢?为什么不只是在不添加的情况下定义类方法@classmethod或者@staticmethod或任何@定义? tl;dr: 什么时候 我应该使用它们吗为什么 我应该使用它们吗?如何我应该使用它们吗? 答案 尽管classmethod和staticmethod非常相似,两个实体的用法都有很小的差异:classmethod必须对类对象作为第一个参数的引用,而staticmethod根本没有参数。 例子 class Date(object): def __init__(self, day=0, month=0, year=0): self.day = day self.month = month self.year = year @classmethod def from_string(cls, date_as_string): day, month, year = map(int, date_as_string.split('-')) date1 = cls(day, month, year) return date1 @staticmethod def is_date_valid(date_as_string): day, month, year = map(int, date_as_string.split('-')) return day <= 31 and month <= 12 and year <= 3999 date2 = Date.from_string('11-09-2012') is_date = Date.is_date_valid('11-09-2012') 解释 让我们假设一个班级的例子,处理日期信息(这将是我们的样板):...

@staticmethod和@classmethod之间的区别

装饰的功能有什么区别@staticmethod和一个装饰有@classmethod? 答案 也许有些示例代码会有所帮助:注意foo,,,,class_foo和static_foo: class A(object): def foo(self, x): print(f"executing foo({self}, {x})") @classmethod def class_foo(cls, x): print(f"executing class_foo({cls}, {x})") @staticmethod def static_foo(x): print(f"executing static_foo({x})") a = A() 以下是对象实例调用方法的通常方式。对象实例,a,被隐式通过作为第一个参数。 a.foo(1) # executing foo(<__main__.A object at 0xb7dbef0c>, 1) With classmethods ,对象实例的类被隐式传递为第一个参数,而不是self。 a.class_foo(1) # executing class_foo(<class '__main__.A'>, 1) 你也可以打电话class_foo使用课程。实际上,如果您将某些内容定义为classMethod,则可能是因为您打算从类而不是从类实例中调用它。A.foo(1)本来会提出一个typeserror,但是A.class_foo(1)正常工作: A.class_foo(1) # executing class_foo(<class '__main__.A'>, 1) 人们发现的一种用于班级方法的用途是创建可以继承的替代构造函数。 With staticmethods , 两者都不self(对象实例)也不cls(班级)被隐式传递为第一个参数。它们的行为像普通功能一样,除了您可以从实例或类调用它们: a.static_foo(1) # executing static_foo(1) A.static_foo('hi') # executing static_foo(hi) staticMethods用于分组与类与类的逻辑连接的函数。 foo只是一个功能,但是当您致电时a.foo您不仅可以获得函数,还可以通过对象实例获得该函数的"部分应用"版本a将第一个参数绑定到函数。foo期望有2个论点,而a.foo只期望1个论点。 a一定会foo。这就是以下"绑定"一词的含义: print(a.foo) # <bound method A....

$ stmt-> execute():如何知道数据库插入是否成功?

有了以下代码,我怎么知道将任何东西都插入了DB中? if ($stmt = $connection->prepare("insert into table (blah) values (?)")) { $stmt->bind_param("s", $blah); $stmt->execute(); $stmt->close(); } 我原以为添加以下行会起作用,但显然不行。 if($stmt->affected_rows==-1){$updateAdded="N"; echo "failed";} 然后使用$ UpdatedAdded =" n",然后在页面下方跳过其他代码,这些代码取决于上述插入成功。 有任何想法吗? 答案 这execute()方法返回boolean…所以这样做: if ($stmt->execute()) { // it worked } else { // it didn't } 来自: stackoverflow.com

base() 和 this() 构造函数最佳实践

在什么条件下我应该做出:base()和:this()构造函数调用位于构造函数的括号后面(甚至在代码中的其他位置)。 答案 : base(...) 如果省略对基本构造函数的调用,它将自动调用默认的基本构造函数。 如果没有默认构造函数,则必须显式调用基本构造函数。 即使有默认构造函数,您可能仍然希望调用与默认构造函数不同的构造函数。base(foo, bar)调用与基本构造函数不同的构造函数。 我不认为省略是一种不好的做法base()当你想调用基类默认构造函数时,尽管如果你想明确地表达出来,我认为包含它没有什么坏处。 : this(...) 此语法允许您使用与同一类中的另一个构造函数不同的签名来调用构造函数。 当它很有用的一个例子是重用公共代码的构造函数。 Foo(int x, int y) { this.x = x; this.y = y; } Foo(int x) : this(x, 10) {} // y defaults to 10 与C 在构造函数中重用代码的另一种方法是将其分解为静态函数,每个希望使用它的构造函数都会调用该静态函数。 来自: stackoverflow.com

c

一组Pretty的预处理器 hack(兼容 ANSI C89/ISO C90)会是什么样子,它们可以在 C 中实现某种丑陋(但可用)的面向对象? 我熟悉几种面向对象的语言,因此请不要以"学习C ++!“之类的答案回答。我读过了 “用ANSI C面向对象的编程” (谨防:PDF format)和其他一些有趣的解决方案,但我对您的最感兴趣:-)! 也可以看看*您可以在C中编写面向对象的代码吗?* 答案 C对象系统(COS)听起来很有希望(它仍在Alpha版本中)。它试图为了简单性和灵活性而保持最小的可用概念:统一的面向对象的编程,包括开放类,元类,属性元元,仿制药,多途径,多途径,代表团,所有权,例外,合同,合同和封闭。有一个草稿(PDF)描述它。 Exception in C是在其他OO语言中发现的try-catch-Finages的C89实现。它带有测试仪和一些例子。 laurent deniau俩都在工作很多在c。 来自: stackoverflow.com

C

在C语言中这是可能的吗 在整个代码中,我已经广泛使用了 DataCell 类,现在才意识到我需要向它添加一个额外的属性,因为创建一个继承自此类的新扩展类看起来不需要进行大量重写。 数据单元[元数据] public class DataCell : Message { public int Field1; public int Field2; public DataCell() { .. } .. } 基本上我想添加一个 public int Flags; 答案 首先,您可能应该重新考虑您的方法。有点向密封类添加属性: using System; using System.Runtime.CompilerServices; namespace DataCellExtender { #region sample 3rd party class public class DataCell { public int Field1; public int Field2; } #endregion public static class DataCellExtension { //ConditionalWeakTable is available in .NET 4.0+ //if you use an older ....

C - 在类中构造对象

我对 C 相当陌生,我对此不太确定。 class Foo { //stuff }; class Bar { Foo foo; }; 所以 Bar 包含一个完整的 Foo 对象,而不仅仅是一个引用或指针。 谢谢。 答案 它将由其默认构造函数初始化。 class Foo { public: Foo(int val) { } //stuff }; class Bar { public: Bar() : foo(2) { } Foo foo; }; 来自: stackoverflow.com