什么是对象?
什么是类?
- 类:可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的 Turtle表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。
- 例如创建乌龟这个类
class Turtle:
bodyColor = "绿色"
footNum = 4
weight = 10
hasShell = True
#会爬
def crawl(self):
print("乌龟会爬")
#会吃东西
def eat(self):
print("乌龟吃东西")
#会睡觉
def sleep(self):
print("乌龟在睡觉")
#会缩到壳里
def protect(self):
print("乌龟缩进了壳里")
面向对象编程(Object-oriented Programming,简称 OOP)
class 类名:
多个(≥0)类属性…
多个(≥0)类方法…
注意,无论是类属性还是类方法,对于类来说,它们都不是必需的,可以有也可以没有。另外,Python 类中属性和方法所在的位置是任意的,即它们之间并没有固定的前后次序。
Python类对象的创建和使用
Python类的实例化
对已定义好的类进行实例化,其语法格式如下:
#类名(参数)
turtle1=Turtle()
python可以动态添加类对象的属性和方法
def say_hi(self):
print("Hi, my name is " + turtle.name)
turtle.say_hi = say_hi
turtle.say_hi(turtle)
注:动态添加的属性和方法只属于该对象别的实例化对象不能使用
self 的用法
- 那么,self 参数的具体作用是什么呢?打个比方,如果把类比作造房子的图纸,那么类实例化后的对象是真正可以住的房子。根据一张图纸(类),我们可以设计出成千上万的房子(类对象),每个房子长相都是类似的(都有相同的类变量和类方法),但它们都有各自的主人,那么如何对它们进行区分呢?当然是通过 self 参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。
Python类变量和实例变量(类属性和实例属性)
- 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;
- 类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;
- 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。
类变量(类属性)
- 类变量指的是在类中,但在各个类方法外定义的变量。举个例子:
class Turtle:
name="Mike"
color="black"
legs=4
def __init__(self,name,color,legs):
self.name=name
self.color=color
self.legs=legs
上述代码中name、color、legs就是类变量
- 类变量的特点是:所有类的实例化对象都同时共享类变量,也就是说,类变量在所有实例化对象中是作为公用资源存在的。类方法的调用方式有 2 种,既可以使用类名直接调用,也可以使用类的实例化对象调用。
注意,因为类变量为所有实例化对象共有,通过类名修改类变量的值,会影响所有的实例化对象。
实例变量(实例属性)
- 实例变量指的是在任意类方法内部,以==“self.变量名”的方式定义的变量==,其特点是只作用于调用方法的对象。另外,实例变量只能通过对象名访问,无法通过类名访问。
class Turtle:
name="Mike"
color="black"
legs=4
def __init__(self):
self.name="Mike"
self.color="black"
self.legs=4
def say(self):
self.catalog = 13
此 CLanguage 类中,name、color 、legs及catalog 都是实例变量。其中,由于 init() 函数在创建类对象时会自动调用,而 say() 方法需要类对象手动调用。因此,Turtle 类的类对象都会包含 name、color 和legs实例变量,而只有调用了 say() 方法的类对象,才包含 catalog 实例变量。
- 通过类对象可以访问类变量,但无法修改类变量的值。这是因为,通过类对象修改类变量的值,不是在给“类变量赋值”,而是定义新的实例变量
- 类中,实例变量和类变量可以同名,但这种情况下使用类对象将无法调用类变量,它会首选实例变量,这也是不推荐“类变量使用对象名调用”的原因。
局部变量
- 除了实例变量,类方法中还可以定义局部变量。和前者不同,局部变量直接以“变量名=值”的方式进行定义。通常情况下,定义局部变量是为了所在类方法功能的实现。需要注意的一点是,局部变量只能用于所在函数中,函数执行完成后,局部变量也会被销毁。
Python实例方法、静态方法和类方法详解(包含区别和用法)
- 和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法、实例方法和静态方法。
Python类实例方法
- 通常情况下,在类中定义的方法默认都是实例方法。
class Turtle:
#类构造方法,也属于实例方法
def __init__(self):
self.name = "Mike"
self.color = "red"
# 下面定义了一个say实例方法
def say(self):
print("正在调用 say() 实例方法")
实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。
Python类方法
- Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。和 self 一样,cls 参数的命名也不是规定的(可以随意命名),只是 Python 程序员约定俗称的习惯而已。和实例方法最大的不同在于,类方法需要使用@classmethod修饰符进行修饰,例如:
class Turtle:
#类构造方法,也属于实例方法
def __init__(self):
self.name = "Mike"
self.color = "red"
#下面定义了一个类方法
@classmethod
def info(cls):
print("正在调用类方法",cls)
注意,如果没有 @classmethod,则 Python 解释器会将 fly() 方法认定为实例方法,而不是类方法。
Python类静态方法
- 静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。静态方法需要使用@staticmethod修饰,例如:
class Turtle:
@staticmethod
def info(name,color):
print(name,color)