面对对象基础概念
名词 | 描述 |
---|---|
类(Class) | 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 |
类变量 | 类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。 |
数据成员 | 类变量或者实例变量, 用于处理类及其实例对象的相关的数据。 |
方法重写 | 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。 |
局部变量 | 定义在方法中的变量,只作用于当前实例的类。 |
实例变量 | 在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。 |
继承 | 即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。 |
实例化 | 创建一个类的实例,类的具体对象。 |
方法 | 类中定义的函数。 |
对象 | 通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。 |
Python
基本
class Employee:
# '所有员工的基类'
empCount = 0 # 类属性
def __init__(self, name, salary):
self.name = name # 类实例属性
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print "Total Employee %d" % Employee.empCount
def displayEmployee(self):
print "Name : ", self.name, ", Salary: ", self.salary
empCount 变量是一个类变量(类属性,非实例的属性),它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。
第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。
self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
类的继承
class Parent: # 定义父类
parentAttr = 100
def __init__(self):
print "调用父类构造函数"
def parentMethod(self):
print '调用父类方法'
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print "父类属性 :", Parent.parentAttr
def method1(self):
print "调用父类方法1"
class Child(Parent): # 定义子类
def __init__(self):
print "调用子类构造方法"
def childMethod(self):
print '调用子类方法'
def method1(self):
print "调用子类重写的方法1"
c = Child() # 实例化子类
c.childMethod() # 调用子类的方法
c.parentMethod() # 调用父类方法
c.setAttr(200) # 再次调用父类的方法 - 设置属性值
c.getAttr() # 再次调用父类的方法 - 获取属性值
c.method1() # 调用重写的方法
输出结果
调用子类构造方法
调用子类方法
调用父类方法
父类属性 : 200
调用子类重写的方法1
- 如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。
- 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
- Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
- 对于一些特殊的方法,它们的调用与普通方法不同,总结于下。
方法名 | 介绍 |
---|---|
__init__( self [,args...] ) | 构造函数,简单的调用方法: obj = className(args) |
__del__( self ) | 析构方法, 删除一个对象。简单的调用方法 : del obj 或者自动调用 |
__repr__( self ) | 转化为供解释器读取的形式,简单的调用方法 : repr(obj) |
__str__( self ) | 用于将值转化为适于人阅读的形式,简单的调用方法 : str(obj) |
__cmp__( self, x ) | 对象比较,简单的调用方法 : cmp(obj, x) |
Godot
基础
默认情况下,所有脚本文件都是未命名的类。在这种情况下,只能使用文件路径引用它们,使用相对路径或绝对路径。当然,也可以给类一个名称,以便在Godot的编辑器中将其注册为新类型。为此,请使用class_name
关键字。您可以添加一个可选的逗号,后跟一个到图像的路径,以将其用作图标。然后,类将以其新图标出现在编辑器中:
# Item.gd
extends Node
class_name Item, "res://interface/icons/item.png"
# 成员变量(实例属性)
var name
var age
# 成员函数(实例方法)
func abc():
pass
# 静态函数 (静态类方法),注意,静态函数不能访问实例属性。它主要用做tool函数库
static func sum(a,b):
return a+b
Godot的类语法是紧凑的:它只能包含成员变量或函数。可以具有静态函数,但没有静态成员变量(类属性)。
继承
不允许多重继承。
继承使用 extends
关键字,_init()
为所有非内置类型(int, float等)的类构造函数。
在派生类中调用基类方法,使用.基类方法
,类似python中的super语法
# father.gd
class_name father_class
var property
func _init():
property = 12
# child.gd
extends father_class
class_name child_class
func some_func():
pass