Как определить статическое свойство IronPython? - PullRequest
0 голосов
/ 08 июля 2011

Ранее я обнаруживал обсуждение определения статических методов в (железном) Python, однако о статических свойствах я ничего не нашел.Я предполагаю, что вы можете окончательно создать статические свойства, так как свойства - это просто методы для .NET CLR, и это то, что я сделал в приведенном ниже коде, однако, похоже, вызывая статическое свойство "StaticField" Я не могу получить доступзначение статического поля "__staticField", с которым оно связано, вместо этого я получаю ссылку, где хранится свойство?, но если я использую статический метод "getStaticField" , который используется в качестве свойства Get, он правильно дает мне значение "2".

Так что вопрос: вы можете определить статическийСвойства в (железный) Python?и как я могу использовать их, чтобы получить значение, а не ссылку на метод свойства?

Заранее спасибо.

class Test(object):
    __instanceField = 0
    __staticField = 0    

    # Instance Property (read-only)
    def getInstanceField(self):   
        return self.__instanceField    
    InstanceField = property(getInstanceField, None, None)

    # Static Property (read-only)
    @staticmethod
    def getStaticField():
        return Test.__staticField        
    StaticField = property(getStaticField, None, None)

    # Instance Method
    def instanceMethod(self, n):
        self.__instanceField += 1   
        print 'instanceMethod', n

    # Static Method
    @staticmethod
    def staticMethod(n):
        Test.__staticField += 1  
        print 'staticMethod', n

# Calling Static Methods
Test.staticMethod(5)
Test.staticMethod(10)

# Calling Instance Methods
t = Test()
t.instanceMethod(5)
t.instanceMethod(10)

print 'InstanceProperty', t.InstanceField 
#prints 2
print 'StaticProperty', Test.StaticField 
#prints: <property object at 0x000000000000002B>
print 'StaticPropertyMethod', Test.getStaticField()
#prints 2

1 Ответ

1 голос
/ 08 июля 2011

этот ответ для Python в целом, а не только для IronPython.

property - это удобство для создания дескриптора , объекта, который предоставляет __get__ и при необходимости__set__ и __del__ методы.Метод __get__ принимает аргументы для целевого экземпляра, а также для связанного класса, но __set__ никогда не вызывается для классов.Если все, что вам нужно, это поведение получателя без поведения установщика, просто реализуйте дескриптор непосредственно

class StaticGetter(object):
    def __init__(self, attr):
        self.attr = attr
    def __get__(self, instance, owner):
        # owner is the class, your getter code here
        return getattr(owner, attr)

class Test(object):
    __staticField = 0
    staticField = StaticGetter('_Test__staticField')

В случае с установщиком вы можете предоставить метод __set__, который выводит класс из экземпляра, ноорганизация Test.staticField = newvalue для вызова Test.staticField.someSetterMethod(newvalue) потребует нового метакласса.

...