zoukankan      html  css  js  c++  java
  • python面向对象

     面向对象就是抽取某一方面共有的属性出来,构建一个类Class。这个类就叫父类(超类)。

    python构建类的方式:

     1 class Employee:
     2     '员工类'
     3     empCount = 0;'用于计数总共有多少个员工'
     4     '构造方法'
     5     def __init__(self,name,salary):
     6         self.name = name
     7         self.salary = salary
     8         Employee.empCount += 1
     9 
    10     '获取当前有多少员工'
    11     def displayCount(self):
    12         print(u'当前有 %d 员工'% Employee.empCount)
    13 
    14     '展示员工的信息'
    15     def displayEmployee(self):
    16         print(u'名字:',self.name,u'工资:',self.salary)
    View Code

    语法 class 类名: ,(类名与文件名一致)类的构造方法是系统默认的__init__(self)方法,当你在创建对象的时候系统会调用这个方法。你也可以对这个方法重写,python对重写方法没有什么特别的标志。值得注意的是,在类中所有的方法,必须在第一个位置多写一个self参数。这个self指的是当前实例化对象本身。

    类中可以有私有,受保护,公开的属性和方法。具体如下:

    另外还有一个 __system__ 表示系统的

    在构建类的方法时需要注意第一个位置参数self(当然参数名字可以随便取,但是self是行规,方便代码可读性)必须要有。

    python内置类属性:

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

    调用如下

     1 #!/usr/bin/python
     2 # -*- coding: UTF-8 -*-
     3 
     4 class Employee:
     5    '所有员工的基类'
     6    empCount = 0
     7 
     8    def __init__(self, name, salary):
     9       self.name = name
    10       self.salary = salary
    11       Employee.empCount += 1
    12    
    13    def displayCount(self):
    14      print "Total Employee %d" % Employee.empCount
    15 
    16    def displayEmployee(self):
    17       print "Name : ", self.name,  ", Salary: ", self.salary
    18 
    19 print "Employee.__doc__:", Employee.__doc__
    20 print "Employee.__name__:", Employee.__name__
    21 print "Employee.__module__:", Employee.__module__
    22 print "Employee.__bases__:", Employee.__bases__
    23 print "Employee.__dict__:", Employee.__dict__
    View Code

    python垃圾回收:

      同Java语言一样,Python使用了引用计数这一简单技术来追踪内存中的对象。

      在Python内部记录着所有使用中的对象各有多少引用。

      一个内部跟踪变量,称为一个引用计数器。

      当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。

      垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。

    垃圾回收涉及到析构函数__del__,_del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法被运行:

     1 #!/usr/bin/python
     2 # -*- coding: UTF-8 -*-
     3 
     4 class Point:
     5    def __init__( self, x=0, y=0):
     6       self.x = x
     7       self.y = y
     8    def __del__(self):
     9       class_name = self.__class__.__name__
    10       print class_name, "销毁"
    11 
    12 pt1 = Point()
    13 pt2 = pt1
    14 pt3 = pt1
    15 print id(pt1), id(pt2), id(pt3) # 打印对象的id
    16 del pt1
    17 del pt2
    18 del pt3
    View Code

    ==========================================================================

    类的继承:

    python支持多继承。

    语法:class 类名(基类1[,基类2][,基类3]...).

    在创建子类实例对象的时候,系统不会自已去调用父类中的构造方法。需要在子类中手动添加父类的构造方法。如:

     1 #!/user/bin/python
     2 # -*- coding:utf-8 -*-
     3 '''父类'''
     4 class SupClass:
     5     '父类'
     6     supAttribution = 100;
     7     def __init__(self):
     8         print('调用父类构造方法');
     9 
    10     def parentMethod(self):
    11         print('调用父类中的 parentMethod 方法');
    12 
    13     def setAttr(self):
    14         SupClass.supAttribution = self.supAttribution;
    15 
    16     def getAttr(self):
    17         print('父类中的属性',SupClass.supAttribution);
    View Code
     1 #!/user/bin/python
     2 # -*- coding:utf-8 -*-
     3 from SupClass import *
     4 class SubClass(SupClass):
     5     '子类'
     6     def __init__(self):
     7         SupClass.__init__(self);
     8         print('调用子类构造方法');
     9 
    10     def childMethod(self):
    11         print('调用子类中的childMethod 方法');
    View Code

    你可以使用issubclass()或者isinstance()方法来检测。

    • issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
    • isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。

    还需注意的是python中导入的两种方式的区别:

    from ... import ... 与 import ...

    这两者唯一的区别在于:

    第一种导入,在调用类里面的属性方法时,直接类名.方法名;

    第二种导入,在调用类里面的属性方法时,需要全限定名才能调用。

    ============================================================================

    子类中的方法重写

    python类中方法的重写没有什么特殊的标志,你只需在子类中用父类中的方法名就行。python在调用方法的时候,首先会去自身中去找有没有该方法,有的话就调用自身的方法。如果没有就往父类中去寻找,一级一级往上找。如果父类中也没有的话就会报一个属性错误:

    AttributeError: 'SubClass' object has no attribute 'lss'

    =====================================================================

    基础重载方法:

    下面列出了一些通用的功能,你可以在自己的类重写:

       __init__(self[,args...]) 构造函数

      __del__(self)析构方法,删除一个对象

      __repr__(self)转化为供解释器读取的形式

      __str__(self) 格式化输出方法

      __cmp__(self,x)对象比较

    ======================================================================

    python 支持运算符重载

     1 #!/usr/bin/python
     2 
     3 class Vector:
     4    def __init__(self, a, b):
     5       self.a = a
     6       self.b = b
     7 
     8    def __str__(self):
     9       return 'Vector (%d, %d)' % (self.a, self.b)
    10    
    11    def __add__(self,other):
    12       return Vector(self.a + other.a, self.b + other.b)
    13 
    14 v1 = Vector(2,10)
    15 v2 = Vector(5,-2)
    16 print v1 + v2
    View Code

    最后,python中类的私有属性不是绝对意义上的私有,在外部也可以改变类的私有属性的值。

     1 #!/user/bin/python
     2 # -*- coding:utf-8 -*-
     3 class ClassAttr:
     4     __secreCount = 0;#类的封闭属性
     5     publicCount = 0;#类的公开属性
     6 
     7     def count(self):
     8         self.__secreCount += 1;
     9         self.publicCount += 1;
    10         print(self.__secreCount);
    View Code

    私有属性 __secreCount 可以通过这样访问修改

    类中的私有属性被修改了

  • 相关阅读:
    【面积并】 Atlantis
    【动态前k大 贪心】 Gone Fishing
    【复杂枚举】 library
    【双端队列bfs 网格图建图】拯救大兵瑞恩
    【奇偶传递关系 边带权】 奇偶游戏
    【权值并查集】 supermarket
    CF w4d3 A. Pythagorean Theorem II
    CF w4d2 C. Purification
    CF w4d2 B. Road Construction
    CF w4d2 A. Cakeminator
  • 原文地址:https://www.cnblogs.com/hf-china/p/5106668.html
Copyright © 2011-2022 走看看