GVKun编程网logo

JavaScript:Class.method 与 Class.prototype.method

10

对于JavaScript:Class.method与Class.prototype.method感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于classmethod&staticmeth

对于JavaScript:Class.method 与 Class.prototype.method感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于classmethod&staticmethod 以及 __slots__、django classonlymethod和python classmethod有什么区别?、easypermissions拒绝权限后闪退。 java.lang.NoSuchMethodError: No virtual method isStateSaved()Z in class L...、groovy – metaClass.methods和metaClass.metaMethods有什么区别?的宝贵知识。

本文目录一览:

JavaScript:Class.method 与 Class.prototype.method

JavaScript:Class.method 与 Class.prototype.method

以下两个声明有什么区别?

Class.method = function () { /* code */ }Class.prototype.method = function () { /* code using this.values */ }

是否可以将第一条语句视为静态方法的声明,将第二条语句视为实例方法的声明?

答案1

小编典典

是的,第一个函数与该构造函数的对象实例没有关系,您可以将其视为
“静态方法”

在 JavaScript 中,函数是 一等
对象,这意味着您可以像对待任何对象一样对待它们,在这种情况下,您只需向 函数对象 添加一个属性。

第二个函数,当您扩展构造函数原型时,它将可用于使用new关键字创建的所有对象实例,并且该函数中的上下文(this关键字)将引用您调用它的实际对象实例。

考虑这个例子:

// constructor functionfunction MyClass () {  var privateVariable; // private member only available within the constructor fn  this.privilegedMethod = function () { // it can access private members    //..  };}// A ''static method'', it''s just like a normal function // it has no relation with any ''MyClass'' object instanceMyClass.staticMethod = function () {};MyClass.prototype.publicMethod = function () {  // the ''this'' keyword refers to the object instance  // you can access only ''privileged'' and ''public'' members};var myObj = new MyClass(); // new object instancemyObj.publicMethod();MyClass.staticMethod();

classmethod&staticmethod 以及 __slots__

classmethod&staticmethod 以及 __slots__

  • 什么是python中的classmethod,它的用途是什么?

    • classmethod装饰器对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

      class Demo:
          @classmethod
          def klassmeth(*args):
              return args
          """
          Usage::
          >>>Demo.klassmeth()
          >>> (<class ''__main__.Demo''>, ''span'')
          """
              
    • klasssmeth 返回全部位置参数
    • 不管怎么样调用Demo.klassmenth,它的第一个参数始终是Demo类.
  • 什么是python中的staticmethod,它的用途是什么?

    • staticmethod是一个将类中的方法静态化,无需实例便可调用.

      #!/usr/bin/python
      # -*- coding: UTF-8 -*-
      
      class C(object):
      @staticmethod
      def f():
          print(''runoob'');
      
      C.f();          # 静态方法无需实例化
      cobj = C()
      cobj.f()        # 也可以实例化后调用
  • __slots__用于什么地方?

    • 首先我们要明白一个概念.默认情况下Python在各个实例中名为__dict__的字典里存储的实力属性,为了是底层的散列表提升访问速度,字典会消耗大量内存.
    • 通过__slots__类属性,能节省大量内存.方法事让解释器在元组中存储属性,而不是字典.
    • 继承自超类__slots__属性没有效果,Python只会使用各个类中定义的__slots__属性.
    • 定义__slots__属性之后,实例不能再有__slots__中所列名称之外的其他属性.
    • 如果把__dict__这个名称添加到__slots__中,是一个糟糕的选择.
    • 如果不把__weakref__加入__slots__,实例就不能作为弱引用的目标.

django classonlymethod和python classmethod有什么区别?

django classonlymethod和python classmethod有什么区别?

为什么Django需要引入装饰器classonlymethod?为什么它不能重用python classmethod

答案1

小编典典

最好的解释是源代码本身:

class classonlymethod(classmethod):    def __get__(self, instance, cls=None):        if instance is not None:            raise AttributeError("This method is available only on the class, not on instances.")        return super().__get__(instance, cls)

区别在于,classmethod可以在实例上调用a,与在类上调用具有相同的效果,但是classonlymethod只能在类上调用。

easypermissions拒绝权限后闪退。 java.lang.NoSuchMethodError: No virtual method isStateSaved()Z in class L...

easypermissions拒绝权限后闪退。 java.lang.NoSuchMethodError: No virtual method isStateSaved()Z in class L...

Process: com.tazan.cd.streetlight, PID: 18825
   java.lang.NoSuchMethodError: No virtual method isStateSaved()Z in class Landroid/support/v4/app/FragmentManager; or its super classes (declaration of ''android.support.v4.app.FragmentManager'' appears in /data/app/com.tazan.cd.streetlight-sc-sX-rNCVNlO4qWt3BQkw==/base.apk:classes20.dex)
       at pub.devrel.easypermissions.RationaleDialogFragmentCompat.showAllowingStateLoss(RationaleDialogFragmentCompat.java:48)
       at pub.devrel.easypermissions.helper.BaseSupportPermissionsHelper.showRequestPermissionRationale(BaseSupportPermissionsHelper.java:43)
       at pub.devrel.easypermissions.helper.PermissionHelper.requestPermissions(PermissionHelper.java:66)
       at pub.devrel.easypermissions.EasyPermissions.requestPermissions(EasyPermissions.java:148)
       at com.tazan.cd.streetlight.activity.MainActivity.requestCodeQRCodePermissions(MainActivity.java:615)
       at com.tazan.cd.streetlight.activity.MainActivity.onStart(MainActivity.java:553)
       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1339)
       at android.app.Activity.performStart(Activity.java:7392)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3157)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302)
       at android.app.ActivityThread.-wrap12(Unknown Source:0)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891)
       at android.os.Handler.dispatchMessage(Handler.java:108)
       at android.os.Looper.loop(Looper.java:166)
       at android.app.ActivityThread.main(ActivityThread.java:7425)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

  错误大致如上:

  问题是 isStateSaved是在support 26版本后加入的,可以 compileSdkVersion改为27,并且将easypermissions更新到最新版2.0.1

  或在app的build.gradle里加入下面一段代码统一android support库为27版本

  

subprojects {
    afterEvaluate {project ->
        if (project.hasProperty("android")) {
            android {
                compileSdkVersion 27
                buildToolsVersion ''27.0.3''
                defaultConfig {
                    targetSdkVersion 27
                }

            }
        }
    }
}

 

groovy – metaClass.methods和metaClass.metaMethods有什么区别?

groovy – metaClass.methods和metaClass.metaMethods有什么区别?

如果我向类添加元方法,我希望它出现在Class.MetaClass.MetaMethods中.但事实似乎并非如此.特别是,如果我这样做:

class Example {
    def realFoo() { "foo" }

}
Example.MetaClass.MetaFoo = { -> "foo" }

def reals = Example.MetaClass.methods*.name.grep{it.contains("Foo")}
def Metas = Example.MetaClass.MetaMethods*.name.grep{it.contains("Foo")}

println "reals = $reals,Metas = $Metas"

我希望reals的输出= [realFoo],Metas = [MetaFoo],但实际上我得到的是reals = [realFoo,MetaFoo],Metas = [].

看起来新的元方法存储在方法中,而不是MetaMethods.那么,MetaClass.methods和MetaClass.MetaMethods有什么区别?

解决方法

MetaMethods包含Groovy在类上修饰的那些方法,但实际上并不是类的直接部分或它的继承结构,或者是通过MetaClass手动插入类的方法.

这些在DefaultGroovyMethods类中定义.

根据您要实例化的对象类型,它主要是迭代器,如每个,收集,查找等.

对代码的这种修改显示了仅限元,仅“真实”和共享的方法:

class Example {
    def realFoo() { "foo" }

}
Example.MetaClass.MetaFoo = { -> "foo" }

def reals = Example.MetaClass.methods.name.sort().unique()
def Metas = Example.MetaClass.MetaMethods.name.sort().unique()

def MetaOnly = Metas - reals
def realOnly = reals - Metas
def shared = reals.findAll { Metas.contains(it) }

println """
MetaOnly = $MetaOnly
realOnly = $realOnly
shared = $shared
"""

结果:

MetaOnly = [addShutdownHook,any,asBoolean,asType,collect,dump,each,eachWithIndex,every,find,findAll,findindexOf,findindexValues,findLastIndexOf,findResult,getAt,getMetaPropertyValues,getProperties,grep,hasProperty,identity,inject,inspect,is,isCase,iterator,MetaClass,print,printf,println,putAt,respondsTo,sleep,split,sprintf,use,with]
realOnly = [equals,getClass,getProperty,hashCode,MetaFoo,notify,notifyAll,realFoo,setProperty,wait]
shared = [getMetaClass,invokeMethod,setMetaClass,toString]

所有MetaOnly和shared方法都在DefaultGroovyMethods中.所有“真正的”方法都在类本身上,或者在它的父类(在本例中为Object)上,加上一些直接与MetaClass相关的groovy事物来获取/设置MetaClass以及getProperty / setProperty和invokeMethod它允许您覆盖方法行为.

如果你想搜索所有方法以查看存在的内容,我会使用以下内容:

def allMethods = (Example.MetaClass.methods + Example.MetaClass.MetaMethods).name.sort().unique()

今天的关于JavaScript:Class.method 与 Class.prototype.method的分享已经结束,谢谢您的关注,如果想了解更多关于classmethod&staticmethod 以及 __slots__、django classonlymethod和python classmethod有什么区别?、easypermissions拒绝权限后闪退。 java.lang.NoSuchMethodError: No virtual method isStateSaved()Z in class L...、groovy – metaClass.methods和metaClass.metaMethods有什么区别?的相关知识,请在本站进行查询。

本文标签: