类的定义
类是用来描述具有相同的属性和方法的对象的集合。
例如:具有颜色,使用年限,品牌的车,可以归为车类。
创建一个类
Python 中定义一个类使用 class 关键字实现,其基本语法格式如下:
class <类名>:
<类体>
在 <类体> 中一般可以包含以下三个部分:
- 类的说明文档:
我们也可以为类定义说明文档,其要放到<类名>之后,<类体>之前的位置 - 属性:
属性,即变量 - 方法
方法,即函数
注意:在类中,<类体> 部分并不是必要存在的,类属性和类方法也没有固定的前后顺序。当我们要建立一个空的类时,可以用pass来代替 <语句> 部分
创建一个示例类:
class chair:
'''这是一个椅子的类''' #文档说明
#类属性
color = "绿色"
foot = 4
#类方法
def sit(self):
print("能坐")
构造函数__init__
构造函数__init__在实例化时会将实例属性,自动初始化。
个人理解:init就是一个函数,具有形参,函数体等结构,与实例方法结构没有什么区别。其作用是将类中实例方法需要用到的属性,在实例化时统一先进行定义。
说明:构造方法的运行先于一切类或实例的方法,其定义的实例属性,可以被其后的方法直接调用
示例:
# 创建一个包含init函数的类
'''
__init__函数后面的self,color,shape为函数的形参
'''
def __init__(self,color,shape="方形"):
'''self.color,self.shape是实例属性,在实例化时,将init函数的实参值,赋予实例属性。 '''
self.color=color
self.shape=shape
self.weight=5
print()
在上面这个案例里,构造函数部分,出现了init函数的三种初始化参数。
- color :这是最常用的形参,在初始化后,将值赋予对应的实例属性。
- shape:在函数定义时,给形参赋予了默认值,初始化后,将默认值赋予实例属性。
- self.weight:这是个特殊的实例属性,由于它是在init函数体中定义的默认值,所以不能出现在形参位置。
self参数
self参数的本质就是个形参,用于传入实例本身。
无论是在构造方法,还是实例方法中,self参数都是必须存在的,且要位于所以参数的第一位。同时,self在Python中并不是关键字,即可以用其他符合标识符规则的字符替代。
比如将上面的chair类中的self换成name也是可以的。
# 创建一个包含init函数的类
class chair:
'''这是一个椅子的类''' #文档说明
#类变量
foot = 4
#构造函数
def __init__(name,color,shape="方形"):
name.color=color
name.shape=shape
name.weight=5
print()
#类方法
def sit():
print("{}条腿的椅子能坐".format(chair.foot))
#实例方法
def describe(name,school):
name.school=school
print("这把椅子属于{},有{}条腿,颜色是{},形状是{},重量{}kg。".format(name.school,name.foot,name.color,name.shape,name.weight))
类体中各部分名称
- 类属性
类属性的作用域是整个类,即该属性是整个类共有的,在不同实例中均可使用。
'''
创建一个chair类,定义实例t1,t2均为该类,打印t1,t2两个实例的foot值均为4
可以看出类属性foot可以被不同实例调用
'''
class chair:
#类变量
foot = 4
t1=chair()
t2=chair()
print(t1.foot)
print(t2.foot)
# 返回
4
4
- 实例属性
实例属性的作用域是该实例本身,即该属性为该实例本身所有,在不同实例中,不能相互使用。
在类体中,实例属性出现在实例方法和构造方法中,一般形式为self.属性名
'''
创建一个chair类,定义实例t1,t2均为该类,调用实例方法w并分别给形参weight赋值5,4
两个实例方法的返回值分别对应了各自的实参,可以看出实例属性仅在自身实例中使用。
'''
class chair:
#方法
def w(self,weight): #weight是函数w的形参
self.weight=weight #self.weight就是一个实例属性
print("椅子的重量是",self.weight)
t1=chair()
print(t1.w(5))
t2=chair()
print(t2.w(4))
# 返回
'''
椅子的重量是 5
椅子的重量是 4
'''
- 类方法
- 类方法最明显的标志是不包含参数(self参数也没有),这是一种属于类的方法,只可以包含类属性,在类方法中使用类属性时格式有两种:
类名.类属性名或使用魔法函数__class__.属性名 - 在调用类方法时,要使用**类名.类方法名()**的格式
下面两个类方法的结果是一样的:
#用类名.类属性名
class chair:
#类变量
foot = 4
#类方法
def sit():
print("{}条腿的椅子能坐".format(chair.foot))
chair.sit() #调用类方法
#魔法函数__class__.属性名
class chair:
#类变量
foot = 4
#类方法
def sit():
print("{}条腿的椅子能坐".format(__class__.foot))
chair.sit() #调用类方法
- 实例方法
实例方法用于表达类的行为,在类中以函数的形式表现。一个类中可以具有不定数量的实例方法。
在实例方法中不仅可以调用方法本身定义的实例属性,还可以调用构造函数中定义的属性和类属性。
示例如下:
class chair:
#类变量
foot = 4
#构造函数
def __init__(self,color,shape="方形"):
self.color=color
self.shape=shape
self.weight=5
#实例方法
def describe(self,school):
self.school=school
print("这把椅子属于{},有{}条腿,颜色是{},形状是{},重量{}kg。".format(self.school,self.foot,self.color,self.shape,self.weight))
a=chair("黄色")
a.describe("五十七中")
#返回
这把椅子属于五十七中,有4条腿,颜色是黄色,形状是方形,重量5kg。
属性、方法的调用
方法调用:实例名.方法名
# 将chair2实例化后,调用方法describe
class chair2:
def describe(self):
print("这是一把椅子")
a=chair2()
a.describe()
属性调用:
- 调用类属性:类名.类属性名
定义好类以后,想要查看类属性,可以直接使用类名.实例名的格式,如果进行了实例化,也可以使用实例名.类属性
class chair:
#类变量
foot = 4
school = "南开"
c=chair()
print(c.school) #实例名.类属性名
print(chair.school) #类名称.类属性名
# 返回
南开
南开
- 在实例方法中调用:self.属性名。
在实例方法中,Python会先在实例属性中进行查找对应的属性名,如果没有会在类属性中进行查找。
在下方案例中可以看到,类属性定义了school=“南开”,同时在方法describe中定义了实例属性self.school,在方法调用self.school时,优先在实例属性里寻找。在方法调用self.foot时,由于实例属性没有进行定义,所以调用了类属性。
class chair:
#类变量
foot = 4
school = "南开"
#实例方法
def describe(self,school):
self.school=school
print("这把椅子属于{},有{}条腿".format(self.school,self.foot))
c=chair("绿色")
c.describe("五十七中")
print(c.school)
print(chair.school)
# 返回
这把椅子属于五十七中,有4条腿
五十七中
南开
访问限制
-
受保护属性
属性名前加单下划线,如:_name
受保护属性只能被类本身和实例使用(不知道除了此外还有哪能用)。 -
私有属性
属性名前加双下划线,如:_ _name
私有属性只能被类本身访问,不能被实例访问,但可以通过:“实例名._类名 _ _属性名”访问
示例:
class person():
# 受保护属性
_name = '张三'
# 私有属性
__rname = '法外狂徒'
def __init__(self):
print(person._name,'的外号是',person.__rname)
t=person()
print(t)
print(t._name) # 调用受保护属性
print(t._person__rname) #调用私有属性
# 返回
张三 的外号是 法外狂徒
<__main__.person object at 0x0000000007D73F08>
张三
法外狂徒