python的面向对象

本文主要记录了python的面向对象技术。运行环境:macOS 10.12.6


面向对象技术简介

  • 类:用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象共有的属性和方法。对象是类的实例。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
  • 实例化:创建一个类的实例,类的具体对象。

  • 方法:类中定义的函数.
  • 数据成员:类变量或实例变量用于处理类及其实例对象的相关数据。
  • 方法重载:如果从父类继承的方法不能满足子类需求,可以对其进行改写,这个过程叫做方法的覆盖(override),重载。
  • 实例变量:定义在方法中的变量,只作用于当前实例的类。
  • 类变量:在整个实例化的对象中是公用的,类变量定义都在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 继承:即一个派生类(derived Class)继承基类(base class)的字段和方法。

    创建类

    使用class语句来创建一个新类,如下实例:
    1
    2
    3
    4
    5
    6
    class ClassName:
    '类的帮助信息' #类文档字符串
    类变量 #类体 class_suite由类成员、方法、数据属性构成
    def __int__(self,paramers): #累的构造方法
    def function(self,...)
    ......
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#coding:utf-8
class Employee:
'''
this is a test demo class
'''
classstr = "it is a test class"
def __init__(self,name,pay):
self.name = name
self.pay = pay
def hello(self):
'''
say hello
'''
print(self.name)
print("say hello")


worker1 = Employee('小明',10000)
print(type(worker1))
worker1.hello()
worker2 = Employee('李四',3000)
worker2.hello()
print(Employee.classstr)
#help(worker1)

#结果:
<class '__main__.Employee'>
小明
say hello
李四
say hello
it is a test class

python中有三种方法:实例方法,类方法以及静态方法。
实例方法一般以self作为第一个参数,必须和具体的对象实例进行绑定后才可以访问。通过self引用的可能是类属性,也可能是实例属性(根据具体情况分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
类方法以cls作为第一个参数,cls表示类本身,定义时使用@classmethod,那么通过cls引用的必定是类对象的属性和方法。
静态方法不需要默认的任何参数,跟一般的普通函数类似,定义的时候使用@staticmethod。静态方法中不需要额外定义参数,因此在金泰方法中引用类属性的话,必须通过类对象来引用。

访问属性

使用.来访问对象的属性。
getattr(obj,name[,default]):访问对象属性
hasattr(obj,name):检查是否存在一个属性
setattr(obj,name,value):设置一个属性,如果属性不存在,会创建一个新属性
delattr(obj,name):删除属性

内置类属性

1
2
3
4
5
__dict__  :类的属性(包括一个字典,由类的数据熟悉组成)
__doc__ :类的文档字符串
__name__ :类名
__module__:类定义所在的模块(类的全名是 __main__.className , 如果类位于一个导入模块mymod中,那么className.__module__ 等于mymod)
__bases__ :类的所有父类构成元素(包含了一个由所有弗雷组成的元组)

python对象销毁

在python内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量,成为一个引用计数器。
当对象呗创建时,就创建了一个引用计数,当这个对象不再需要时,即引用计数变为0时,他被垃圾回收,但是回收不是立即的,由接收器在适当的时机,将垃圾对象占用的内存空间回收。

类的继承

1
2
3
class 派生类名称(基类名)    #基类是在类定义的时候,在元组之中指明的

例如:class C(A,B)

python继承的一些特点:

  1. 在继承中,基类的构造不会被自动调用,需要在其派生类的构造中亲自专门调用
  2. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量,区别于在类中调用普通函数时并不需要带上self参数
  3. python总是首先找对应类型的方法,如果不能再派生类中找到对应方法,他才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类找)
    如果在继承元组中列了一个以上的类,那么他就被称作“多重继承”
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #coding:utf-8
    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):
    Parent()
    print("调用子类构造函数")
    def childMethod(self):
    print("调用子类方法child method")

可以使用issubclass() 或者 isinstance()方法来检测。
issubclass() 布尔函数判断一个雷是另一个类的子类或者子孙类。语法:issubclass(sub,sup)
isinstance(obj,Class) 不二函数如果obj是class类的实例对象或者是一个Class子类的实例对象,则为true

方法重写

如果父类方法功能不能满足需求,可以方法重写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#coding:utf-8
class Parent:
parentAttr = 100
def __init__(self):
print("调用父类构造函数")
def parentMethod(self):
print("调用父类方法")

class Child(Parent):
def __init__(self):
Parent()
print("调用子类构造函数")
def parentMethod(self):
print("方法重写")

本文标题:python的面向对象

文章作者:Jerry

发布时间:2018年02月06日 - 16:47:25

最后更新:2019年09月05日 - 23:41:01

原始链接:https://jerryma0912.github.io/2018/02/06/6-python-class/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。