python 类,, 1 #!/usr/


 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 = name10       self.salary = salary11       Employee.empCount += 112    13    def displayCount(self):14      print "Total Employee %d" % Employee.empCount15  16    def displayEmployee(self):17       print "Name : ", self.name,  ", Salary: ", self.salary

empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 Employee.empCount 访问。

1 >>> fff = Employee(‘fff‘,‘100000‘)2 >>> fff.displayCount()3 Total Employee 14 >>> zzj=Employee(‘zzj‘,‘1000‘)5 >>> zzj.displayCount()6 Total Employee 27 >>> 

self代表类的实例,而非类

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。


1 class Test: 2 def prt(self): 3 print(self) 4 print(self.__class__) 5 t = Test() 6 t.prt()

结果

<__main__.Test instance at 0x10d066878>__main__.Test

从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类

#!/usr/bin/python# -*- coding: UTF-8 -*- 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 "创建 Employee 类的第一个对象"emp1 = Employee("Zara", 2000)"创建 Employee 类的第二个对象"emp2 = Employee("Manni", 5000)emp1.displayEmployee()emp2.displayEmployee()print "Total Employee %d" % Employee.empCount

执行

Name :  Zara ,Salary:  2000Name :  Manni ,Salary:  5000Total Employee 2
emp1.age = 7  # 添加一个 ‘age‘ 属性emp1.age = 8  # 修改 ‘age‘ 属性del emp1.age  # 删除 ‘age‘ 属性

你也可以使用以下函数的方式来访问属性:

getattr(obj, name[, default]) : 访问对象的属性。hasattr(obj,name) : 检查是否存在一个属性。setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。delattr(obj, name) : 删除属性。
hasattr(emp1, ‘age‘)    # 如果存在 ‘age‘ 属性返回 True。getattr(emp1, ‘age‘)    # 返回 ‘age‘ 属性的值setattr(emp1, ‘age‘, 8) # 添加属性 ‘age‘ 值为 8delattr(empl, ‘age‘)    # 删除属性 ‘age‘

Python内置类属性

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

Python内置类属性调用实例如下:

 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 = name10       self.salary = salary11       Employee.empCount += 112    13    def displayCount(self):14      print "Total Employee %d" % Employee.empCount15  16    def displayEmployee(self):17       print "Name : ", self.name,  ", Salary: ", self.salary18  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__

Employee.__doc__: 所有员工的基类Employee.__name__: EmployeeEmployee.__module__: __main__Employee.__bases__: ()Employee.__dict__: {‘__module__‘: ‘__main__‘, ‘displayCount‘: <function displayCount at 0x10a939c80>, ‘empCount‘: 0, ‘displayEmployee‘: <function displayEmployee at 0x10a93caa0>, ‘__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 0x10a939578>}

继承:

在python中继承中的一些特点:

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

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

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

基础重载方法

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

序号方法, 描述 & 简单的调用
1__init__ ( self [,args...] )
构造函数
简单的调用方法:obj = className(args)
2__del__( self )
析构方法, 删除一个对象
简单的调用方法 :del obj
3__repr__( self )
转化为供解释器读取的形式
简单的调用方法 :repr(obj)
4__str__( self )
用于将值转化为适于人阅读的形式
简单的调用方法 :str(obj)
5__cmp__ ( self, x )
对象比较
简单的调用方法 :cmp(obj, 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

执行

以上代码执行结果如下所示:

Vector(7,8)

类的私有方法

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

 1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3   4 class JustCounter: 5     __secretCount = 0  # 私有变量 6     publicCount = 0    # 公开变量 7   8     def count(self): 9         self.__secretCount += 110         self.publicCount += 111         print self.__secretCount12  13 counter = JustCounter()14 counter.count()15 counter.count()16 print counter.publicCount17 print counter.__secretCount  # 报错,实例不能访问私有变量

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

__foo__: 定义的是特列方法,类似__init__()之类的。

_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于from module import *

__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

测试实例:

 1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3  4 class JustCounter: 5     __secretCount = 0  # 私有变量 6     publicCount = 0    # 公开变量 7     def count(self): 8         self.__secretCount += 1 9         self.publicCount += 110         print self.__secretCount11     def count2(self):12         print self.__secretCount13 14 counter = JustCounter()15 counter.count()16 # 在类的对象生成后,调用含有类私有属性的函数时就可以使用到私有属性.17 counter.count()18 #第二次同样可以.19 print counter.publicCount20 print counter._JustCounter__secretCount  # 不改写报错,实例不能访问私有变量21 try:22     counter.count2()23 except IOError:24     print "不能调用非公有属性!"25 else:26     print "ok!" #现在呢!证明是滴!

python 类

评论关闭