Python类的定义和使⽤详情
⽬录
1.基础概念
2.定义⼀个Person类
3.类定义
4.类⽅法定义
5.类的继承
6.类的公有,私有
7.⼦类调⽤⽗类的⽅法
1.基础概念
在⾯向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也被称为实例,instance),
其中类是某⼀批对象的抽象,可以把类理解成某种概念;对象才是⼀个具体存在的实体。从这个意义上看,⽇常所说的⼈,其实都是⼈的对象,⽽不是⼈类。
Python 定义类的简单语法如下:
class 类名:
执⾏语句...
零个到多个类变量...
零个到多个⽅法...
类名只要是⼀个合法的标识符即可,但这仅仅满⾜的是 Python 的语法要求:如果从程序的可读性⽅⾯来看,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')  # ok
5.类的继承
# coding:utf-8
python干嘛用的if __name__ == '__main__':
'''
在声明类的时候指定这个类继承哪些类
class 类名():
属性,⽅法......
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()  # xie
7.⼦类调⽤⽗类的⽅法
# 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类的定义与使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。