这个问题不是讨论单身人士设计模式是否可取,反模式,还是任何宗教战争,而是讨论如何以最蟒蛇的方式在Python中最好地实现这种模式.在这种情况下,我将"最pythonic"定义为表示它遵循"最小惊讶原则".
我有多个类可以成为单例(我的用例是记录器,但这并不重要).当我可以简单地继承或装饰时,我不希望在添加gumph的几个类中混乱.
最好的方法:
def singleton(class_):
instances = {}
def getinstance(*args, **kwargs):
if class_ not in instances:
instances[class_] = class_(*args, **kwargs)
return instances[class_]
return getinstance
@singleton
class MyClass(BaseClass):
pass
Run Code Online (Sandbox Code Playgroud)
优点
缺点
m = MyClass(); n = MyClass(); o = type(n)();那时m == n && m != o && n != oclass Singleton(object):
_instance = None
def __new__(class_, *args, **kwargs):
if not isinstance(class_._instance, class_):
class_._instance = object.__new__(class_, *args, **kwargs)
return class_._instance
class MyClass(Singleton, …Run Code Online (Sandbox Code Playgroud) 我何时应该使用接口,何时应该使用基类?
如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?
如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.
我有一个类(A),它为其中一个字段使用堆内存分配.A类被实例化并作为指针字段存储在另一个类(B)中.
当我完成对象B时,我调用delete,我假设调用了析构函数...但是这也调用了A类中的析构函数吗?
从答案中,我接受了(请编辑,如果不正确):
class A B的实例调用B :: ~B();class Bdelete 应该显式地将delete所有堆分配的成员变量A;命名基类的推荐方法是什么?它是否在类型名称前加上" Base "或" Abstract ",或者我们只是用"Base"作为后缀?
考虑以下:
type:ViewModel例如MainViewModel,ReportViewModel
基类:BaseViewModel或ViewModelBase或AbstractViewModel
还要考虑:
type:Product例如VirtualProduct,ExpiringProduct
基类:BaseProduct或ProductBase或AbstractProduct
您认为哪个更标准?
class Entity : EntityBase
{
}
Run Code Online (Sandbox Code Playgroud)
要么
class Entity : BaseEntity
{
}
Run Code Online (Sandbox Code Playgroud) class Person
{
public int age;
public Person()
{
age = 1;
}
}
class Customer : Person
{
public Customer()
{
age += 1;
}
}
Customer customer = new Customer();
Run Code Online (Sandbox Code Playgroud)
客户的年龄是2岁吗?似乎无论如何都会调用基类的构造函数.如果是这样,我们为什么base有时需要打电话?
public Customer() : base()
{
.............
}
Run Code Online (Sandbox Code Playgroud) 是否可以使用C#中的显式类型转换将基类对象分配给派生类引用?
我试过它,它会产生运行时错误.
如果我有以下代码示例:
public class ClassBase
{
public int ID { get; set; }
public string Name { get; set; }
}
public class ClassA : ClassBase
{
public int JustNumber { get; set; }
public ClassA()
{
this.ID = 0;
this.Name = string.Empty;
this.JustNumber = string.Empty;
}
}
Run Code Online (Sandbox Code Playgroud)
如何在Name不修改的情况下隐藏属性(不显示为ClassA成员)ClassBase?
我需要扩展Networkx python包并Graph为我的特殊需要添加一些方法
我想这样做的方法是简单地推导出一个新类说NewGraph,并添加所需的方法.
然而,networkx中还有一些其他函数可以创建和返回Graph对象(例如,生成随机图).我现在需要将这些Graph对象转换为NewGraph对象,以便我可以使用我的新方法.
这样做的最佳方式是什么?或者我应该以完全不同的方式解决问题?
以下代码不使用gcc编译,但使用Visual Studio编译:
template <typename T> class A {
public:
T foo;
};
template <typename T> class B: public A <T> {
public:
void bar() { cout << foo << endl; }
};
Run Code Online (Sandbox Code Playgroud)
我收到错误:
test.cpp:在成员函数'void B :: bar()'中:
test.cpp:11:错误:在此范围内未声明'foo'
但它应该是!如果我换bar到
void bar() { cout << this->foo << endl; }
Run Code Online (Sandbox Code Playgroud)
然后它确实编译,但我不认为我必须这样做.GCC在这里遵循C++官方规范中的某些内容,还是仅仅是一个怪癖?
我有一个基类Person和派生类Manager和Employee.现在,我想知道的是创建的对象是Manager或者Employee.
该人的具体如下:
from Project.CMFCore.utils import getToolByName
schema = getattr(Person, 'schema', Schema(())).copy() + Schema((TextField('FirstName', required = True, widget = StringWidget(label='First Name', i18n_domain='project')), TextField('Last Name', required = True, widget = StringWidget(label='Last Name', i18n_domain='i5', label_msgid='label_pub_city'))
class Manager(BaseContent):
def get_name(self):
catalog = getToolByName(self, "portal_catalog")
people = catalog(portal_type='Person')
person={}
for object in people:
fname = object.firstName
lname = object.lastName
person['name'] = fname+' '+ lname
# if the derived class is Employee then i would like …Run Code Online (Sandbox Code Playgroud) base-class ×10
c# ×4
python ×3
c++ ×2
inheritance ×2
casting ×1
constructor ×1
decorator ×1
destructor ×1
explicit ×1
interface ×1
metaclass ×1
name-lookup ×1
oop ×1
plone ×1
properties ×1
singleton ×1
templates ×1