54

基本クラス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 go to the method title of employee and if its a Manager then go to the title method of Manager
        person['post'] = Employee/Manager.title()
      return person

マネージャーと従業員にとって、彼らは似ています(従業員も似ていますが、いくつかの異なる方法です)

from Project.Person import Person
class Manager(Person):
    def title(self):
      return "Manager"

従業員の場合、タイトルは「従業員」です。私が作成するとき、PersonそれはまたはのいずれManagerEmployeeです。personオブジェクトを取得すると、クラスはPersonですが、派生クラス「Manager」または「Employee」のどちらからのものかを知りたいです。

4

7 に答える 7

57

これがあなたが望むものであるかどうか、そしてあなたがそれをどのように実装したいかはわかりませんが、ここで試してみてください:

>>> class Person(object):
    def _type(self):
        return self.__class__.__name__


>>> p = Person()
>>> p._type()
'Person'
>>> class Manager(Person):
    pass

>>> m = Manager()
>>> m._type()
'Manager'
>>> 

_type長所:メソッドの定義は1つだけです。

于 2012-07-10T07:23:33.590 に答える
13

x.__class__.__name__クラス名を文字列として取得するために使用できます。例:

class Person:
    pass

class Manager(Person):
    pass

class Employee(Person):
    pass

def get_class_name(instance):
    return instance.__class__.__name__

>>> m = Manager()
>>> print get_class_name(m)
Manager
>>> print get_class_name(Employee())
Employee

または、isinstanceを使用してさまざまなタイプをチェックできます。

>>> print isinstance(m, Person)
True
>>> print isinstance(m, Manager)
True
>>> print isinstance(m, Employee)
False

したがって、次のようなことができます。

def handle_person(person):
    if isinstance(person, Manager):
        person.read_paper()     # method of Manager class only
    elif isinstance(person, Employee):
        person.work_hard()      # method of Employee class only
    elif isinstance(person, Person):
        person.blah()           # method of the base class
    else:
        print "Not a person"
于 2012-07-10T07:22:27.303 に答える
9

Pythonオブジェクトは、__class__そのオブジェクトの作成に使用される型を格納する属性を提供します。__name__これにより、タイプの名前を文字列として取得するために使用できる属性が提供されます。したがって、単純なケースでは、次のようになります。

class A(object):
    pass
class B(A):
    pass

b = B()
print b.__class__.__name__

与えるだろう:

'B'

だから、私があなたの質問に正しく従えば、あなたはそうするでしょう:

m = Manager()
print m.__class__.__name__
'Manager'
于 2012-07-10T07:22:44.603 に答える
8

このようなものをお探しですか?

>>> class Employee:
...     pass
... 
>>> class Manager(Employee):
...     pass
... 
>>> e = Employee()
>>> m = Manager()
>>> print e.__class__.__name__
Employee
>>> print m.__class__.__name__
Manager
>>> e.__class__.__name__ == 'Manager'
False
>>> e.__class__.__name__ == 'Employee'
True
于 2012-07-10T08:37:22.757 に答える
4

「これを行う」ための最良の方法は、それを行わないことです。代わりに、ManagerまたはEmployeeでオーバーライドされるPersonにメソッドを作成するか、サブクラスに基本クラスを拡張する独自のメソッドを指定します。

class Person(object):
    def doYourStuff(self):
        print "I'm just a person, I don't have anything to do"

class Manager(object):
    def doYourStuff(self):
        print "I hereby manage you"

class Employee(object):
    def doYourStuff(self):
        print "I work long hours"

基本クラスでどのサブクラスがインスタンス化されているかを知る必要がある場合は、プログラムに設計エラーがある可能性があります。他の誰かが後でPersonを拡張して、Contractorという新しいサブクラスを追加した場合はどうしますか?サブクラスがハードコードされた代替物のいずれでもない場合、Personは何をしますか?

于 2012-07-10T07:29:42.180 に答える
0

In your example you do not need to know the class, you just call the method by referring to the class instance:

# if the derived class is Employee then i would like go to the method title 
# of employee and if its a Manager then go to the title method of Manager
person['post'] = object.title()

But do not use object as a variable name, you hide the built-in name.

于 2012-07-10T08:35:20.387 に答える
0

Pythonクラスには、__subclasses__現在スコープ内のどのクラスが特定の親クラスから派生しているかを確認するために使用できるマジックメソッドがあります。

# related.py

class Parent: ...

class Child(Parent): ...
>>> from related import Parent
>>> Parent.__subclasses__()
[<class 'related.Child'>]

Parentこれらのクラスは、クラスにアクセスした時点でのスコープ内の派生クラスへの弱参照です。

# not_related.py

class StepChild(Parent): ...
>>> from related import Parent
>>> Parent.__subclasses__()
[<class '__main__.Child'>]
>>> from not_related import StepChild
>>> Parent.__subclasses__()
[<class 'related.Child'>, <class 'not_related.StepChild'>]
于 2021-12-02T20:40:11.223 に答える