python 面向对象

面向对象

概念

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在方法体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量:定义在方法中的变量,只作用于当前实例的类。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

demo

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

class Employee:
 '所有员工的基类'
 empCount = 0 #类变量 所有实例之间共享 内部类或外部类使用 Employee.empCount 访问

 def __init__(self, name): #构造函数或初始化方法 创建实例时就会调用该方法
     self.name = name
     Employee.empCount += 1

 def displayCount(self):
        print "目前构造的对象个数 %d" % Employee.empCount

 def displayEmployee(self):
     print "Name : ", self.name

self 代表类的实例,代表当前对象的地址,而 self.class 则指向类 ,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数******************************

创建对象:emp1 = Employee(“Zara”)
访问属性:emp1.displayEmployee() emp1.age
修改属性值
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’

print “Employee.doc:”, Employee.doc #类的文档字符串
print “Employee.name:”, Employee.name # 类名
print “Employee.module:”, Employee.module #类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
print “Employee.bases:”, Employee.bases #类的所有父类构成元素(包含了一个由所有父类组成的元组)
print “Employee.dict:”, Employee.dict #类的属性(包含一个字典,由类的数据属性组成)

python对象销毁(垃圾回收)

实际上是一个引用计数器和一个循环垃圾收集器(对象互相引用)
析构函数 __del__ ,__del__在对象销毁的时候被调用,当对象不再被使用时,__del__方法运行

类的继承

class SubClassName (ParentClass1[, ParentClass2, …]):

1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别在于类中调用普通函数时并不需要带上self参数
    class bb(aa):
             def __init__(self):
                 aa.__init__(self)
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。

类的方法重写

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

class Child(Parent): # 定义子类
     def myMethod(self): #重写
         print '调用子类方法'

类的静态方法

需要在相应的方法上面添加 @staticmethod 同时不需要添加self
调用的时候 类名.方法名() 即可

类私有属性与方法

类的私有属性
    __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

类的方法
    在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数

类的私有方法
    __private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods

下划线

单下划线、双下划线、头尾双下划线说明:

_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。

以单下划线开头 _foo 意思是只有类对象和子类对象自己能访问到这些变量 不能直接访问的类属性,私有的 ,不能用 from xxx import * 而导入; 叫做保护变量,
 以双下划线开头的 __foo 意思是只有类对象自己能访问,连子类对象也不能访问到这个数据 代表类的私有成员; ,
 以双下划线开头和结尾的 __foo__ 代表 Python 里特殊方法专用的标识,如 __init__() 代表类的构造函数。

内置方法 init enter exit:

class sth(object):
def init(self,a):
self.a = a
def enter(self):
print u’haha’
return self.a
def exit(self):
print u’haha’

with sth(‘nihoa’) as s:
print s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值