面向对象
java接触过面向对象,主要学习下语法和与java的差异
1、 创建类
使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾
class Student:
"学生基类"
studentCount = 0;
def __init__(self,name,score):
self.name = name
self.salary = salary
Student.studentCount += 1
def displayCount(self):
print("Total Student %d" %Student.studentCount)
def displayStudent(self):
print("Name:",self.name,",Score:",self.score)
-
studentCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。可以在内部类或外部类使用 Student.studentCount 访问。
-
第一种方法__init__()方法是类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
-
self 代表类的实例,self 在定义类的方法时是必须有的
2、创建实例对象
Python 中没有new这个关键字,类的实例化类似函数调用方式。以下使用类的名称 Student 来实例化,并通过 init 方法接收参数
"创建 Student 类的第一个对象"
stu1 = Student("yantao",100)
"创建 Student 类的第二个对象"
stu2 = Student("dji",100)
3、 访问、添加、修改、删除属性
stu1.displayStudent()
stu2.displayStudent()
stu1.age = 2;添加对象属性
stu1.age = 26;添加对象属性
del stu1.age ;添加对象属性
输出结果:
4、python对象销毁(垃圾回收)
引用计数法+循环垃圾收集器
在 Python 内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量,称为一个引用计数器。当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。
5、类的继承
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类
在python中继承中的一些特点:
- 如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。
- 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
- Python是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)
- python支持多继承
语法:
派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,多继承格式如下:
class SubClassName (ParentClass1,ParentClass2, …):
class Parent: # 定义父类
parentAttr = 100
def __init__(self):
print("调用父类构造函数")
def parentMethod(self):
print('调用父类方法')
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print("父类属性 :", Parent.parentAttr)
class Child(Parent): # 定义子类
def __init__(self):
print("调用子类构造方法")
def childMethod(self):
print('调用子类方法')
c = Child() # 实例化子类
c.childMethod() # 调用子类的方法
c.parentMethod() # 调用父类方法
c.setAttr(200) # 再次调用父类的方法 - 设置属性值
c.getAttr() # 再次调用父类的方法 - 获取属性值
输出结果:
6、方法重写
子类中重写父类方法
class Parent: # 定义父类
def myMethod(self):
print('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
输出结果:
7、类属性与方法
单下划线、双下划线、头尾双下划线说明:
- foo: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。
- _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
- _ foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了(self. _foo)。
- 类的方法
- 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
class JustCounter:
__secretCount = 0 # 私有变量
publicCount = 0 # 公开变量
def count(self):
self.__secretCount += 1
self.publicCount += 1
print(self.__secretCount)
counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCount)
print(counter.__secretCount) # 报错,实例不能访问私有变量
输出结果: