Python面向对象基础语法
如果学习过Java等面向对象编程的话会更容易学习Python的面向对象语法,因为Python的面向对象语法是在它们的基础上简化或者略微修改的。
1、类中的方法的第一个形参是额外形参,不需要传入参数,一般默认命名为self,self代表类的实例
代码实例:
class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
运行结果:
2、构造方法与Java不同,不是和类名相同的方法而是统一的
代码实例:
#__init__为构造方法
class Employee:
'所有员工的基类'
empCount = 0
def __init__(self, name, salary):
self.name = name
self.salary = salary
Employee.empCount += 1
def displayCount(self):
print("Total Employee %d" % Employee.empCount)
def displayEmployee(self):
print("Name : ", self.name, ", Salary: ", self.salary)
3、创建对象时不需要用new
代码实例:
#创建对象时不需要用new
emp1 = Employee("Zara", 2000)
4、对类属性的增删改和访问
代码实例:
#对类属性的增删改
emp1.age = 7 # 添加一个 'age' 属性
emp1.age = 8 # 修改 'age' 属性
del emp1.age # 删除 'age' 属性
#对类属性的访问
hasattr(emp1, 'age') # 如果存在 'age' 属性返回 True。
getattr(emp1, 'age') # 返回 'age' 属性的值
setattr(emp1, 'age', 8) # 添加属性 'age' 值为 8
delattr(emp1, 'age') # 删除属性 'age'
5、内置类属性
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
6、对象的销毁(垃圾回收机制)
代码实例:
#对象的销毁(垃圾回收机制)
class Point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print(class_name, "销毁")
pt1 = Point()
pt2 = pt1
pt3 = pt1
print(id(pt1), id(pt2), id(pt3)) # 打印对象的id
del pt1
del pt2
del pt3
运行结果:
7、类的继承
在python中继承中的一些特点:
1、如果在子类中需要父类的构造方法就需要显式的调用父类的构造方法,或者不重写父类的构造方法。详细说明可查看: python 子类继承父类构造函数说明。
2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
3、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
代码实例:
#对象的销毁(垃圾回收机制)
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() # 再次调用父类的方法 - 获取属性值
运行结果:
7、方法重写
类似Java的方法重写,无需赘述,直接在子类中定义一个和父类拥有相同方法头的方法即可。
8、公有成员和私有成员及其调用
类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods
Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性
代码实例:
#公有成员和私有成员
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) # 报错,实例不能访问私有变量
#可以使用object._className__attrName( 对象名._类名__私有属性名 )
访问属性
print(counter._JustCounter__secretCount)
运行结果:
补充:
单下划线、双下划线、头尾双下划线说明:
__foo__: 定义的是特殊方法,一般是系统定义名字 ,
类似 __init__() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量,
即保护类型只能允许其本身与子类进行访问,
不能用于 from module import *
__foo: 双下划线的表示的是私有类型(private)的变量,
只能是允许这个类本身进行访问了。