二、类的定义、对象的创建、属性和方法
2.1 类定义的简单语法
class 类名:
类体
注意点:
1)类名追寻标识符命名方式,见名知意,注意首字母大写。可以使用中文
2)注意冒号别忘写了,语法中没有大括号,使用缩进表示类体
2.2 属性和方法
一个普通的类的定义:
class Animal:
name = "biology"
def __init__(self,kind,color):
self.kind = kind
self.color = color
@staticmethod
def move():
str = "moving~"
print(str)
def desc(self):
print(f"这是一只{self.kind},它的颜色是{self.color}")
def __del__(self):
pass
属性:在以上例子中,name、self.kind、self.color都属于类的属性,它们也统称为成员变量(注意str不是属性),用来表示类或对象的特征
方法:类体中定义的函数叫做方法,其中 init和del分别叫构造函数和析构函数,用来表示类或对象的行为
2.3 静态和非静态
某些方法和属性,如果在一个类中是共通的,我们称之为类属性和类方法,或者称他们为静态属性和静态方法,例如上一段代码中的属性name和方法move,所有的动物都叫做生物,所有的动物都会动
反之,某些属性和方法因对象的不同而不同,我们称之为实例属性和实例方法,例如上一段代码中的属性self.kind和方法desc,动物的种类和颜色因对象的不同而改变
2.4 对象的创建
对象创建的语法:
类名(实参列表)
例如:
Animal("dog","yellow")
以上的代码就创建了一个Animal的对象,并且它会返回所创建对象的内存地址,我们把它赋值给一个变量dog
dog = Animal("dog","yellow")
如此一来我们就获得了一个对象,并用dog来指向它,这个dog变量我们称之为引用
如何获得类中的属性和方法
静态属性
#类名.静态属性名
print(Animal.name)
"""
输出
biology
"""
**注意:
1)类名后面不要加括号,加了括号就表示对象了
2)上面代码的执行过程中没有涉及到对象的创建和销毁,所以不会执行init和del方法
静态方法
#类名.静态方法名(实参列表)
Animal.move()
"""
输出
moving~
"""
注意:
1)使用@staticmethod装饰器时,函数形参列表中不要加cls。当使用@classmethod时形参中才加上cls
实例属性
#引用.实例变量
dog = Animal("dog", "yellow")
print(dog.kind)
print(Animal("dog", "black").color)
"""
输出
dog
该对象被gc回收
black
该对象被gc回收
"""
注意两种不同的语法形式
实例方法
#引用.实例方法
dog = Animal("dog", "yellow")
dog.desc()
Animal("dog", "black").desc()
"""
输出
这是一只dog,它的颜色是yellow
这是一只dog,它的颜色是black
"""
注意两种不同的语法形式
注意:
1) 类级别下不能调用实例属性和函数,但是实例可以调用类级别的属性和方法
例如:
print(Animal.kind)
"""
输出
AttributeError: type object 'Animal' has no attribute 'kind'
"""
报错:AttributeError
print(Animal("dog","yellow").name)
"""
输出
biology
"""
符合实际世界的逻辑:抽象出来的“动物类”没有“种类”之说,但是dog是“动物类”,当然具有“biology”这一属性
值
2)静态函数不可直接使用实例变量,可以使用静态变量。实例函数可以使用实例变量和静态变量
3)静态变量的定义在方法外,实例变量的定义最好在init方法中(在方法中也可以定义实例变量,但是不太符合逻辑,此事IDE会报错)
4)静态函数使用@staticmethod或@classmethod修饰,实例方法不用修饰