创建类
使用class关键字来创建一个类,class之后为类的名称并以冒号结尾,后跟类体。
在类体的第一行可以写一个字符串,作为该类的文档声明,这个文档声明可以通过ClassName.__doc__查看:
class ClassName: '类的帮助信息' #类文档字符串 class_suite #类体 |
类的体中可以包含 成员属性 成员方法 构造方法等内容
class Person: "代表人的类" name="" addr = "bj" def __init__(self,name="zs"): self.name = name print("Person被构造了。。。") def eat(self): print("吃。。。") def sleep(self): print("睡。。。") |
成员属性
python类中可以包含成员属性。
当创建该类的对象时,对象都会默认具有该属性。
成员方法
python类中的方法和其他方法不同之处在于,方法中必须存在一个叫self的参数,这个self代表的当前对象本身,相当于java中的this
构造方法
python中的类可以指定构造方法。
在python类中定义名字为__init__的方法,就是python的构造方法。
创建对象
python中没有new关键字,直接使用类名就可以创建出对象
p = Person() print(p.name) p.eat() |
|
增加 删除 对象的属性和方法
在python中,类的和对象关系并不是一种强关联,类仅仅是创建对象的模版,一旦对象创出来,对象就是一个独立的个体,可以自己增加或删除属性和方法.
注意,删除操作只能删除后天增加的属性和方法,对于类中的属性和方法无法删除
另外,可以在对象创建出来后增加删除属性方法,意味着哪怕是同一个类创建的对象,也可以非常的不同。
#增加属性 p1 = Person() p1.age = 19 #增加方法 def study(): print("学习。。。。") p1.study=study p1.study() #删除属性 del p1.age #删除方法 del p1.study |
|
|
面向对象三大特性 - 封装 - 访问权限控制
python中类的属性和方法都可以进行访问权限的控制,控制的方法为:
- 属性或方法名称如果以单下划线开头,则表示属性或方法是保护成员,只能在类内部或子类内部访问,但是这仅仅是一种约定,在语法层面并没有这种限制。
- 属性或方法名称如果以双下划线开头,则是私有成员,只能在类的内部访问,外界无法使用,这是python语法的一部分。
class Person: __name = "zs" def __say(self): print("说 。。")
p = Person() print(p.__name) p.__say() |
面向对象三大特性 - 继承
python类支持继承。python支持多继承。
继承的语法:
class subClass (superClass,[…]): 类体 |
子类在构造时并不会自动调用父类的构造方法,如果需要,则应在子类的构造方法中显式的调用父类构造。
在子类中调用父类方法时,需要通过父类名来调用。
如果多重继承中,多个父类有同名方法,则具体继承到哪一个取决于父类的继承顺序,继承声明中越靠前优先级越高。
在子类中如果不喜欢父类的方法,可以进行重写操作,在子类中声明和父类名称和参数相同的方法,自己来实现。
class Person: name="" age=0 def eat(self): print("吃..") def say(self): print("说..") class Teacher(Person): def teach(self): print("教..") def run(self): print("跑步..") class Coder(Person): def code(self): print("写代码..") def run(self): print("跑代码..") class JavaTeacher(Teacher,Coder): def run(self): print("边跑步边写代码..") t1 = JavaTeacher() t1.eat() t1.say() t1.code() t1.teach() t1.run() |
面向对象三大特性 - 多态
Python中引用没有类型,引用可以先后等于完全不同类型的数据,自然也就没有多态的概念了。
类的内置属性
python的类中自动包含若干内置属性,这些内置属性往往具有特定功能
__dict__ | 类的属性(包含一个字典,由类的数据属性组成) |
__doc__ | 类的文档字符串 |
__name__ | 类名 |
__module__ | 类定义所在的模块 |
__bases__ | 类的所有父类构成元素(包含了一个由所有父类组成的元组) |
案例:
如果当前模块是程序的入口,则模块名会被改为__main__,如果不是则模块名等于文件名。
因此,通常在模块中会写这样的代码,从而让模块被直接执行和被import导入是执行不同逻辑
if __name__ =="__main__": 当模块被直接执行时走的逻辑 else: 当模块被import导入时执行的逻辑 |
类的内置方法
python中的类自带了很多基础方法,这些方法提供了类的特定功能。
可以在需要时通过重写来改造这些方法来实习特定的需求。
__init__(self [,args...]) | 构造函数,在创建对象时执行 |
__del__(self) | 析构函数,在对象被销毁时执行 |
__str__(self) | 用于将对象转换为一个字符串 |
__cmp__(self,x) | 实现对象比较 |