Python面向对象编程

    本来想顺便讲一讲面向对象编程的思想,但是随便一搜发现资料好多,而且内容都是洋洋洒洒几百上千字,所以本文就不在啰嗦了,有兴趣的童鞋自行百度撒~;

    面向对象三个特征:封装,继承,多态。

    封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏;

    继承:可以使用现有类的所有功能,并在无需重新编译原来类的情况下对这些功能进行扩展;

    多态: 一个基类的引用符,可以指向多种派生类对象,具有多种不同的形态,这种现象叫多态性;


Python中类的定义格式:

class ClassName:
   '类的帮助信息'   #类文档字符串
   class_suite  #类体
下面通过例子直接来理解class的使用方法。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
    '所有员工的基类'
    empCount=0            #类变量,它的值在这个类的所有实例之间共享,可以使用Employee.empCount访问

    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


"创建类的第一个对象"
emp1=Employee("Zara",2000)
"创建类的第二个对象"
emp2=Employee("Manni",5000)

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

run C:\Anaconda\tclass.py
Name: Zara ,Salary: 2000
Name: Manni ,Salary: 5000
Total Employee 2

#添加删除修改属性  
emp1.age=7
emp1.age=8
del emp1.age

#访问属性
hasattr(emp1,'age')
getattr(emp1,'age')
setattr(emp1,'age',8)
delattr(emp1,'age')


Python访问内置类属性:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Employee:
    '所有员工的基类'
    empCount=0            #类变量,它的值在这个类的所有实例之间共享,可以使用Employee.empCount访问

    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


#"创建类的第一个对象"
#emp1=Employee("Zara",2000)
#"创建类的第二个对象"
#emp2=Employee("Manni",5000)

#emp1.displayEmployee()
#emp2.displayEmployee()
#print "Total Employee %d" % Employee.empCount



#内置类属性
print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__


run C:\Anaconda\tclass.py
Employee.__doc__: 所有员工的基类
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x0000000003B92B38>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x0000000003B92BA8>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x0000000003B92AC8>}


Python对象垃圾回收

析构函数 __del__ ,__del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法运行:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

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

以上实例运行结果如下:

3083401324 3083401324 3083401324
Point 销毁



Python对象类的继承:

#!/usr/bin/python
# -*- 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):
        print "调用子类构造方法"

    def childMethod(self):
        print '调用子类方法 child method'

c=Child()
c.childMethod()
c.parentMethod()
c.setAttr(200)
c.getAttr()


# 你可以继承多个类
class A:
    ...

class B:
    ...

class C(A,B):
    ...
运行结果:

run C:\Anaconda\jclass.py
调用子类构造方法
调用子类方法 child method
调用父类方法
父类属性: 200


Python方法重写:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

class Parent:
    def myMethod(self):
        print '调用父类方法'

class Child(Parent):
    def myMethod(self):
        print '调用子类方法'

c=Child()
c.myMethod()

run C:\Anaconda\cclass.py
调用子类方法


Python类的私有属性:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

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  # 出错 实例无法访问私有变量

# 可以这样访问私有变量
print counter._JustCounter__secretCount

运行结果:

run C:\Anaconda\cclass.py
1
2
2
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
C:\Anaconda\cclass.py in <module>()
     15 counter.count()
     16 print counter.publicCount
---> 17 print counter.__secretCount  # 出错 实例无法访问私有变量
AttributeError: JustCounter instance has no attribute '__secretCount'


run C:\Anaconda\cclass.py
1
2
2
2


参考资料:http://www.runoob.com/python/python-object.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值