Ruby中,有两个很重要的对象,一个是Class,一个是Object,虽说在ruby中号称“万物皆对象”,但实际上,Object只是Class的一个实例,而Class是一个增强版的Object(因为Class中除了Object所有的属性外,还拥有其他类特有的属性,例如“方法表”。
1.实例所有的非singleton methods方法都保存在类的“方法表”中,所有的singleton methods都保存在实例单例类中,当调用实例的方法时,ruby会首先去查找这个实例的实例单例类,如果这个单例类存在的话,查找这个单例类的方法表,若此方法表中不存在被调用的方法,则去查找实例对应类的方法表(此处假设没有引入module),若还不存在,则顺着继承关系一直向上找,此时,就只找父类本身的方法表,而忽略父类的单例类。
2.类的类方法都保存在类的单例类中(类本身方法表中存放的方法既实例方法仅供object使用),当定义了一个类方法时
ruby 代码
- def MyClass.myclass_method
- end
-
-
- class << MyClass
- def myclass_method
- end
- end
- #或者
- def self.myclass_method
- end
ruby会尝试去创建MyClass这个类的单例类,然后将方法添加到单例类中,如果单例类已经存在,则直接添加到其中,如果其中有同名方法,则直接覆盖。所以,当调用类方法( MyClass.myclass_method)的时候,ruby会直接查找单例类,如果单例类或者类方法不存在,则顺着继承关系向上找,找父类的单例类,以此类推。注意,此时,在单例类中查找的是单例类的“实例方法”(单例类并不能被实例化,类A也不是A的单例类的一个实例,但是,查找的确实是实例方法,和object的查找有些类似,毕竟ruby中,“万物皆对象”)
ruby 代码
- class A
-
-
-
-
-
- def self.class_method_in_singleton_class
- puts self
- end
- end
-
-
- class B < A
- def self.singleton_method_defined_in_B
- end
- end
-
- class C < B
- end
-
-
-
-
-
-
-
- C.class_method_in_singleton_class
分享到:
相关推荐
引用一个对象实例和该对象的实例方法。在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种情况中,委托不仅存储对方法入口点的引用,还存储对调用...
C++定义一个类中的方法调用 C++如何调用类中定义的方法,调用实例
本文实例讲述了Python操作Oracle数据库的简单方法和封装类。分享给大家供大家参考,具体如下: 最近工作有接触到Oracle,发现很多地方用Python脚本去做的话,应该会方便很多,所以就想先学习下Python操作Oracle的...
大家都知道抽象类无法实例化,就无法创建对象...所以下面这篇文章主要给大家介绍了关于Java实例化一个抽象类对象的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
python基础训练题,类和方法的概念和实例 类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 方法:类中定义的函数。 类的构造方法__init__():...
* (如果是重写即子类将父类的实例方法重写类,则调用子类的,如果是隐藏即方法则父类中声明为静态方法,则调用父类本身的但具体方法中的成员是否被子类修改需要进行分析) —> * 下一层次的父类中重复前一个过程
实例方法:定义实例方法是最少有一个形参 —> 实例对象,通常用 self 类方法:定义类方法的时候最少有一个形参 —> 类对象,通常用 cls 静态方法:定义静态方法的时候可以不定义形参 2、关于方法定义时候添加装饰器...
其次需要这个公共的方法在一个公共的方法类中,这个方法类也需要是public 之后把这个相关的文件编译成dll文件 在其他想要调用这个公共方法的地方引用这个dll 在调用这个公共方法的文件开头声明这个命名空间,用...
本文实例讲述了Python实例方法、类方法、静态方法的区别与作用。分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法、静态方法。它们是如何定义的呢?如何调用的呢?它们...
一、实例方法 实例方法就是类的实例能够使用的方法。如下:复制代码 代码如下:class Foo: def __init__(self, name): self.name = name def hi(self): print self.name if __name__ == ‘__main__’: foo01 = ...
Java 内部类 实例化 在Outer类的静态方法中实例化内部类 在同一个包的其它类中实例化Outer类中的内部类
本文实例讲述了Python面向对象之类和对象。分享给大家供大家参考,具体如下: 类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态); 属性一般是一个个变量;方法是一个个函数; #类的属性 就是 类变量 #...
1.不管你网站有多大,且有多少个class,用此方法之后每个类只需要实例化一次(除非你重启了服务器),听起来有点类似"一次变异长久执行的味道",以往的做法是每个class在客户端每次刷新的时候都要重新用 $实例=New 类名();...
代码定义了一个名为Person的类,它有两个属性name和age,以及一个名为sayHello()的方法。在Main类的main()方法中,我们创建了两个Person类的实例对象,分别为person1和person2。我们设置了对象的属性值,并通过调用...
1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile(程序集路径,不能是相对路径); // 加载程序集(EXE 或 DLL) dynamic obj = assembly....
1、实例方法/对象方法 实例方法或者叫对象方法,指的是我们在类中定义的普通方法。 只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身 2、静态方法 (1).格式:在方法上面添加 @...
在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢?其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块
用java语言编写,实现了一个student类,定义了三个属性,并写了set和get 方法,最后用数组实例化这个类。
Java基础精品课08-方法录屏9.同一个类中静态和实例方法之间的相互调用.mp4
定义一个复数类 complex ,它的内部具有两个实例变量:realPart和imagPart,分别代表复数的实部和虚 部,编程实现要求的数学运算。 (1)实现两个复数相加。复数加运算的原则是:复数的实部和虚部分别相加。 (2...