Любопытство let_ метода свойства

dir встроенный даст Вам атрибуты всего объекта, включая специальные методы как __str__, __dict__ и целый набор других, которых Вы, вероятно, не хотите. Но можно сделать что-то как:

>>> class Foo(object):
...     bar = 'hello'
...     baz = 'world'
...
>>> f = Foo()
>>> [name for name in dir(f) if not name.startswith('__')]
[ 'bar', 'baz' ]
>>> dict((name, getattr(f, name)) for name in dir(f) if not name.startswith('__')) 
{ 'bar': 'hello', 'baz': 'world' }

Так может расширить это, чтобы только возвратить атрибуты данных и не методы, путем определения Вашего props функция как это:

import inspect

def props(obj):
    pr = {}
    for name in dir(obj):
        value = getattr(obj, name)
        if not name.startswith('__') and not inspect.ismethod(value):
            pr[name] = value
    return pr
16
задан Jb Evain 3 December 2009 в 14:55
поделиться

2 ответа

Это вещь COM, которая обнаружена в VB. Set назначает ссылку для замены элемента, на который ссылается свойство, тогда как Let , как ожидается, скопирует содержимое операнда в существующее свойство. (См. Также Property Get .)

IIRC это не основная вещь COM, скорее то, что используется там, где язык не обладает достаточной выразительной способностью для достаточно точного решения проблем значений и ссылок - Я считаю, что это может применяться только тогда, когда вы используете IDispatch (где вы обращаетесь по идентификатору свойства, а не по методу), а не по настраиваемому интерфейсу (где вам всегда нужно разрешить метод и вызвать его). Я почти уверен, что VB.NET (или другие языки .NET) не обнаруживают таких вещей, и, следовательно, они редкость.

Essential COM от Box не упоминает об этом (только propget и propput для получения и установки). COM IDL и дизайн интерфейса доктора Эла Мейджора упоминают об этом на P106 и говорит:

 dispinterface DMyInterface {методы:
...
[id (3), propputref] void lMyProp ([in] IDispatch * pDisp);
}

Атрибут propputref - это странная мелочь, которая берет свое начало в особенностях синтаксиса Visual Basic. Рассмотрим следующее:

 Dim val as DMyOtherInterface
Dim var как DMyInterface

Установите var.lMyProp = val
var.lMyProp = val

Оба назначения допустимы, но означают совершенно разные вещи. Использование ключевого слова Set в первом задании указывает, что lMyProp назначается интерфейс [...]. Второе назначение - простое, где значение объекта val , которое является значением члена по умолчанию интерфейса DMyOtherInterface (член по умолчанию - член, помеченный идентификатором DISPID_VALUE , как будет вскоре объяснено), назначается свойству lMyProp интерфейса DMyInterface .

первое присвоение выполняется с использованием метода propputref, связанного со свойством lMyProp, тогда как второе назначение использует метод propput. Чтобы это сработало, должны быть определены оба метода propputref и propput. Если вас смущает такой способ ведения дел, вы не одиноки. В то время как VB имеет много хороших функций, которые коренным образом изменили природу программирования, определение языка было преимущественно рыночным, а не разработанным, и иногда это показывает .

Забавно, что я никогда не использовал главную книгу с тех пор. читал ее в начале 2000 г. перед крахом COM и .COM (хотя для своей цели это хорошая книга). Спасибо за путешествие по переулку памяти - мне нравится, как люди говорят нам, что программирование становится все сложнее!

Не берите с собой книгу Lidin, чтобы посмотреть, упоминается ли в ней .other , но я уверен, что вы делать (Кстати, большое спасибо за Mono.Cecil)

если вы сбиты с толку таким образом, вы не одиноки. В то время как VB имеет много хороших функций, которые коренным образом изменили природу программирования, определение языка было преимущественно рыночным, а не разработанным, и иногда это показывает .

Забавно, что я никогда не использовал Основную книгу с тех пор. читал ее в начале 2000 года перед крахом COM и .COM (хотя это хорошая книга для своих целей). Спасибо за путешествие по переулку памяти - мне нравится, как люди говорят нам, что программирование становится все сложнее!

Не берите с собой книгу Lidin, чтобы посмотреть, упоминается ли в ней .other , но я уверен, что вы делать (Кстати, большое спасибо за Mono.Cecil)

если вы сбиты с толку таким образом, вы не одиноки. В то время как VB имеет много хороших функций, которые коренным образом изменили природу программирования, определение языка было преимущественно рыночным, а не разработанным, и иногда это показывает .

Забавно, что я никогда не использовал главную книгу с тех пор. читал ее в начале 2000 года перед крахом COM и .COM (хотя это хорошая книга для своих целей). Спасибо за путешествие по переулку памяти - мне нравится, как люди говорят нам, что программирование становится все сложнее!

Не берите с собой книгу Lidin, чтобы посмотреть, упоминается ли в ней .other , но я уверен, что вы делать (Кстати, большое спасибо за Mono.Cecil)

определение языка было преимущественно рыночным, а не разработанным, и иногда оно показывает .

Забавно, что я никогда не использовал главную книгу с тех пор, как прочитал ее в начале 2000 года до краха COM и .COM (это был хорошая книга для своего назначения). Спасибо за путешествие по переулку памяти - мне нравится, как люди говорят нам, что программирование становится все сложнее!

Не берите с собой книгу Lidin, чтобы посмотреть, упоминается ли в ней .other , но я уверен, что вы делать (Кстати, большое спасибо за Mono.Cecil)

определение языка было преимущественно рыночным, а не разработанным, и иногда оно показывает .

Забавно, что я никогда не использовал главную книгу с тех пор, как прочитал ее в начале 2000 года до краха COM и .COM (это был хорошая книга для своего назначения). Спасибо за путешествие по переулку памяти - мне нравится, как люди говорят нам, что программирование становится все сложнее!

Не берите с собой книгу Lidin, чтобы посмотреть, упоминается ли в ней .other , но я уверен, что вы делать (Кстати, большое спасибо за Mono.Cecil)

21
ответ дан 30 November 2019 в 21:54
поделиться

Автоматизация Visual Studio основана на COM. Рассматриваемое свойство, вероятно, было создано с помощью инструмента для поддержки COM-взаимодействия (потенциал tlbimp ). Я сомневаюсь, что кто-то закодировал это на реальном языке, основанном на .Net.

2
ответ дан 30 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: