Величественный имеет справедливо включенную конфигурацию. iOS и Macos совместно используют весь тот же код.
Для структурирования проекта существует commonMain
, nativeCommonMain
зависит от этого, и на самом деле appleMain
, который зависит от nativeCommonMain
.
commonMain {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
}
}
jvmMain {
dependsOn commonMain
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
}
}
nativeCommonMain {
dependsOn commonMain
}
appleMain {
dependsOn nativeCommonMain
}
configure([iosX64Main, iosArm64Main, macosMain, iosArm32Main]) {
dependsOn appleMain
}
, Что структура, вероятно, глубже, чем Вы, нуждаются, но нам было нужно что-то для Linux и окон, который отличался. Ответу Egor выше легче следовать, я думаю.
Мы на самом деле определяем многоплатформенную атомную энергетику в Величественном, таким образом, можно использовать их в качестве вдохновения или на самом деле просто пользоваться самой библиотекой.
https://github.com/touchlab/Stately
expect class AtomicInt(initialValue: Int) {
fun get(): Int
fun set(newValue: Int)
fun incrementAndGet(): Int
fun decrementAndGet(): Int
fun addAndGet(delta: Int): Int
fun compareAndSet(expected: Int, new: Int): Boolean
}
actual typealias AtomicInt = AtomicInteger
actual class AtomicInt actual constructor(initialValue:Int){
private val atom = AtomicInt(initialValue)
actual fun get(): Int = atom.value
actual fun set(newValue: Int) {
atom.value = newValue
}
actual fun incrementAndGet(): Int = atom.addAndGet(1)
actual fun decrementAndGet(): Int = atom.addAndGet(-1)
actual fun addAndGet(delta: Int): Int = atom.addAndGet(delta)
actual fun compareAndSet(expected: Int, new: Int): Boolean = atom.compareAndSet(expected, new)
}
Вместо: « напечатайте hasattr (d1 , каждый)
", попробуйте:" напечатайте каждое, введите (getattr (d1, each))
". Вы должны найти результаты информативными.
Кроме того, вместо dir ()
попробуйте help ()
, который, я думаю, вы действительно ищете.
which tells me strictly speaking that all methods are attributes. but I can't call a method without the () so it seems to me that the hasattr() is misleading.
Why is it misleading? If obj.ban()
is a method, then obj.ban
is the corresponding attribute. You can have code like this:
print obj.getValue()
or
get = obj.getValue
print get()
If you want to get a list of methods on an object, you can try this function. It's not perfect, since it will also trigger for callable attributes that aren't methods, but for 99% of cases should be good enough:
def methods(obj):
attrs = (getattr(obj, n) for n in dir(obj))
return [a for a in attrs if a.hasattr("__call__")]
В идеале, при использовании сложной библиотеки, такой как BeautifulSoup, вы должны проконсультироваться с ее документацией, чтобы посмотреть, какие методы предоставляет каждый класс. Однако в редких случаях, когда у вас нет легкодоступной документации, вы можете проверить наличие методов, используя следующее.
Все методы, которые сами по себе являются объектами, реализуют метод __ call __
и могут быть проверены с помощью метода callable (), который возвращает True
, если проверяемое значение имеет __ вызов метода __
.
Следующий код должен работать.
x = Die()
x.roll()
for attribute in dir(x) :
print attribute, callable(getattr(x, attribute))
Приведенный выше код вернет истину для всех методов и ложь для всех невызываемых атрибутов (таких как элементы данных, такие как ban). Тем не мение, этот метод также возвращает True
для любых вызываемых объектов (например, внутренних классов). вы также можете проверить, является ли тип атрибута instancemethod
Есть встроенный метод callable. Вы можете применить его к любому объекту, и он вернет True / False в зависимости от того, можно ли его вызвать. например
>>> def foo():
... print "This is the only function now"
...
>>> localDictionary = dir()
>>> for item in localDictionary:
... print repr(item) + "is callable: " + str(callable(locals()[item]))
'__builtins__'is callable: False
'__doc__'is callable: False
'__name__'is callable: False
'foo'is callable: True
Обратите внимание, что вызов locals () вернет словарь, содержащий все, что определено в вашей текущей области. Я сделал это, потому что элементы из словаря - это просто строки, и нам нужно запустить вызываемый объект на реальном объекте.
Рассмотрите возможность использования модуля стандартной библиотеки inspect
- часто это самый удобный подход к самоанализу, объединяющий значительные фрагменты функциональности (вы можете реализовать это с нуля, но хорошо использовать повторно) -проверенный, хорошо разработанный код - это хорошо). См. Все подробности в http://docs.python.org/library/inspect.html , но, например, inspect.getmembers (foo, inspect.ismethod)
- отличный способ чтобы получить все методы foo (вы получите (имя, значение)
пар, отсортированных по имени).
This info
module inspired from Dive into Python serves the purpose.
def info(obj, spacing=20, collapse=1, variables=False):
'''Print methods and their doc Strings
Takes any object'''
if variables:
methodList = [method for method in dir(obj)]
else:
methodList = [method for method in dir(obj) if callable(getattr(obj,method))]
#print methodList
print '\n'.join(['%s %s' %
(method.ljust(spacing),
" ".join(str(getattr(obj,method).__doc__).split()))
for method in methodList])
if __name__=='__main__':
info(list)