Python类与对象的核心概念及定义详解
本文深入解析Python中类与对象的核心概念,详细阐述类的定义语法、类变量与实例变量的区别、实例方法的定义规则以及构造方法__init__的作用。通过Person类示例,展示如何创建对象、添加文档字符串及使用类成员,帮助开发者掌握Python面向对象编程的基础技能。
1.基础概念
在面向对象编程体系中,两个核心要素是类(class)和对象(object,亦称实例,instance)。类代表某一类对象的抽象集合,可视为一种概念模型;而对象则是该概念的具体实体存在。举例而言,日常语境中提到的“人”,实际上是指具体的个人对象,而非抽象的人类概念本身。
Python中定义类的基本语法结构如下所示:
class 类名: 执行语句... 零个到多个类变量... 零个到多个方法...
类名只需符合合法标识符的规范即可满足Python语法要求。但从代码可读性角度考量,建议类名由一个或多个有意义单词连缀而成,采用大驼峰命名法(每个单词首字母大写,其余小写),且单词间不使用任何分隔符。
观察上述定义可知,Python类定义在形式上与函数定义相似,均以冒号(:)作为类体起始标志,并通过统一缩进界定类体范围。两者的主要区别在于关键字:函数定义使用def,而类定义使用class。
Python类定义由类头(包含class关键字和类名)及统一缩进的类体组成。类体中最核心的两个组成部分是类变量和方法。若未定义任何类变量或方法,该类即为空类。若空类无需其他执行语句,可使用pass语句作为占位符。
例如,以下类定义在语法上是完全允许的:
class Empty:
pass通常而言,空类在实际开发中意义不大。
类内部各成员的定义顺序互不影响,成员之间可以相互调用。
Python类包含的最重要两个成员为变量和方法。其中,类变量归属于类本身,用于定义类的状态数据;实例变量归属于类的具体对象,用于定义对象的状态数据;方法则用于定义对象的行为或功能实现。
Python作为动态语言,其类变量支持动态增加或删除(在类体中为新变量赋值即增加类变量),程序也可在任何位置为已有类增加变量;此外,程序可通过del语句删除已有类的类变量。
同理,Python对象的实例变量也支持动态增加或删除(对新实例变量赋值即增加实例变量),因此程序可在任何位置为已有对象增加实例变量;程序同样可通过del语句删除已有对象的实例变量。
在类中定义的方法默认为实例方法,其定义方式与函数基本相同。区别在于,实例方法的第一个参数会被绑定到方法的调用者(即该类的实例),因此实例方法至少应定义一个参数,该参数通常命名为self。
注意:实例方法的第一个参数并非必须命名为self,理论上可使用任意参数名。但约定俗成地将其命名为self,能提供最优秀的代码可读性。
在实例方法中,存在一个特殊方法:__init__,,该方法被称为构造方法。构造方法用于构建该类的新对象,Python通过调用构造方法来返回该类的对象(无需使用new关键字)。
Python中许多以双下划线开头、双下划线结尾的方法均具有特殊意义,本教程后续章节将详细介绍这些特殊方法。
构造方法是类创建对象的根本途径。因此,Python提供了一项功能:如果开发者未为类定义任何构造方法,Python会自动为该生成一个仅包含一个self 参数的默认构造方法。
2.定义一个 Person 类
下面程序演示了如何定义一个Person类:
class Person :
'这是一个学习Python定义的一个Person类'
# 下面定义了一个类变量
hair = 'black'
def __init__(self, name = 'Charlie', age=8):
# 下面为Person对象增加2个实例变量
self.name = name
self.age = age
# 下面定义了一个say方法
def say(self, content):
print(content)上述Person类代码定义了一个构造方法,其特殊之处在于方法名为:__init__,该方法的第一个参数同样是self,被绑定到由构造方法初始化的对象。
与函数类似,Python允许为类定义说明文档。该文档同样放置在类声明之后、类体之前,如上面程序中第二行的字符串所示。
定义类之后,接下来即可使用该类的实例。
Python的类大致具备以下作用:
- 定义变量;
- 创建对象;
- 派生子类;
3.类定义
# coding:utf-8
if __name__ == '__main__':
'''
定义:class 类名(object):
类属性,方法等......
实例化: 类名(无参|参数......)
'''
class A(object):
pass
a = A()
print(a) # <__main__.A object at 0x00D9DD50>4.类方法定义
# coding:utf-8
if __name__ == '__main__':
'''
定义:通过def + 方法名(self,参数1,参数2......) self是必须的
调用:object.方法名(参数1,参数2......)
'''
class B(object):
sex = 'man'
def talk(self, name):
print(name)
b = B()
b.talk('ok') # ok5.类的继承
# coding:utf-8
if __name__ == '__main__':
'''
在声明类的时候指定这个类继承哪些类
class 类名(extend1,extend2.......):
属性,方法......
extend1,extend2 代表要继承的类。可以一次性继承多个类
继承顺序为从左到右,如果继承的方法或属性重复,以先继承的为主
class.__mro__ 查看类的继承链
'''
class C(object):
sex = 'woman'
def see(self, name):
print(f'看{name}')
def talk(self, name):
print(f'说{name}')
class D(B, C):
pass
d = D()
d.talk('yes') # yes 不是 说yes 以先继承的为主
d.see('书') # 看书
print(d.sex) # man 不是 woman 以先继承的为主
print(D.__mro__) # (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)6.类的公有,私有
# coding:utf-8
if __name__ == '__main__':
'''
私有属性定义: __+变量名
私有方法定义: __+函数名(self,参数1,参数2......)
私有外部无法访问,只能内部访问。但是私有属性可以在外部通过object._+类名__+变量名 强制访问
'''
class E(object):
__name = 'xie'
sex = 'man'
def __talk(self, name):
print(name)
def run(self):
self.__talk('ok')
def dp(self):
print(self.__name)
e = E()
# print(e.__name) Error 外部无法访问私有属性 D
print(e.sex) # man
# e.__talk('yes') Error 外部无法访问私有方法
# object._+类名__+变量名 强制访问
print(e._E__name) # xie
e.run() # ok
e.dp() # xie7.子类调用父类的方法
# coding:utf-8
if __name__ == '__main__':
'''
通过super().方法(参数1,参数2......)调用,该用法要求python版本3以上
或
supper(子类名,self).方法(参数1,参数2......)
'''
class F(object):
def talk(self, name):
print(f'super name is {name}')
class G(F):
def talk(self, children_name, super_name):
self.print_children_name(children_name)
super().talk(super_name)
def talk2(self, children_name, super_name):
self.print_children_name(children_name)
super(G, self).talk(super_name)
def print_children_name(self, name):
print(f'children name is {name}')
g = G()
g.talk('小明', '大明') # children name is 小明 super name is 大明
g.talk2('小明', '大明') # children name is 小明 super name is 大明
到此这篇关于Python类的定义与使用详情的文章就介绍到这了,更多相关Python类的定义与使用内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









