标签: base-class

在Python中创建单例

这个问题不是讨论单身人士设计模式是否可取,反模式,还是任何宗教战争,而是讨论如何以最蟒蛇的方式在Python中最好地实现这种模式.在这种情况下,我将"最pythonic"定义为表示它遵循"最小惊讶原则".

我有多个类可以成为单例(我的用例是记录器,但这并不重要).当我可以简单地继承或装饰时,我不希望在添加gumph的几个类中混乱.

最好的方法:


方法1:装饰者

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)

优点

  • 装饰器的添加方式通常比多重继承更直观.

缺点

  • 虽然使用MyClass()创建的对象将是真正的单例对象,但MyClass本身是一个函数,而不是一个类,因此您无法从中调用类方法.也是为了m = MyClass(); n = MyClass(); o = type(n)();那时m == n && m != o && n != o

方法2:基类

class 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)

python singleton metaclass decorator base-class

829
推荐指数
14
解决办法
29万
查看次数

接口与基类

我何时应该使用接口,何时应该使用基类?

如果我不想实际定义方法的基本实现,它应该始终是一个接口吗?

如果我有狗和猫类.为什么我要实现IPet而不是PetBase?我可以理解有ISheds或IBarks(IMakesNoise?)的接口,因为那些可以基于宠物放在宠物上,但我不明白哪个用于通用Pet.

language-agnostic oop static-typing interface base-class

754
推荐指数
17
解决办法
15万
查看次数

delete会调用析构函数吗?

我有一个类(A),它为其中一个字段使用堆内存分配.A类被实例化并作为指针字段存储在另一个类(B)中.

当我完成对象B时,我调用delete,我假设调用了析构函数...但是这也调用了A类中的析构函数吗?

编辑:

从答案中,我接受了(请编辑,如果不正确):

  1. class A B的实例调用B :: ~B();
  2. 哪个叫 class B
  3. delete 应该显式地将delete所有堆分配的成员变量A;
  4. 最后,存储所述B实例的内存块返回到堆中 - 当使用new时,它首先在堆上分配一块内存,然后调用构造函数来初始化它,现在在调用所有析构函数来完成对象之后对象所在的块返回到堆.

c++ destructor memory-management base-class delete-operator

161
推荐指数
5
解决办法
27万
查看次数

C#类命名约定:是BaseClass还是ClassBase或AbstractClass

命名基类的推荐方法是什么?它是否在类型名称前加上" Base "或" Abstract ",或者我们只是用"Base"作为后缀?

考虑以下:

type:ViewModel例如MainViewModel,ReportViewModel

基类:BaseViewModelViewModelBaseAbstractViewModel

还要考虑:

type:Product例如VirtualProduct,ExpiringProduct

基类:BaseProductProductBaseAbstractProduct

您认为哪个更标准?

class Entity : EntityBase
{
}
Run Code Online (Sandbox Code Playgroud)

要么

class Entity : BaseEntity
{
}
Run Code Online (Sandbox Code Playgroud)

c# naming-conventions base-class

107
推荐指数
3
解决办法
4万
查看次数

是否会自动调用基类构造函数?

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# constructor base-class

94
推荐指数
5
解决办法
6万
查看次数

是否可以使用显式类型转换将基类对象分配给派生类引用?

是否可以使用C#中的显式类型转换将基类对象分配给派生类引用?

我试过它,它会产生运行时错误.

c# casting explicit base-class derived-class

73
推荐指数
8
解决办法
11万
查看次数

如何在不修改继承类(基类)的情况下隐藏类中的继承属性?

如果我有以下代码示例:

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

c# inheritance properties base-class

43
推荐指数
5
解决办法
7万
查看次数

将基类转换为派生类python(或更多pythonic方式的扩展类)

我需要扩展Networkx python包并Graph为我的特殊需要添加一些方法

我想这样做的方法是简单地推导出一个新类说NewGraph,并添加所需的方法.

然而,networkx中还有一些其他函数可以创建和返回Graph对象(例如,生成随机图).我现在需要将这些Graph对象转换为NewGraph对象,以便我可以使用我的新方法.

这样做的最佳方式是什么?或者我应该以完全不同的方式解决问题?

python inheritance base-class derived-class

38
推荐指数
2
解决办法
3万
查看次数

GCC问题:使用依赖于模板参数的基类成员

以下代码不使用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++官方规范中的某些内容,还是仅仅是一个怪癖?

c++ templates base-class class-members name-lookup

34
推荐指数
4
解决办法
7135
查看次数

如何从基类获取派生类名

我有一个基类Person和派生类ManagerEmployee.现在,我想知道的是创建的对象是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)

python plone base-class derived-class

33
推荐指数
4
解决办法
2万
查看次数