学习过其他面向对象语言的人,对于学习类这个概念,相信是很容易理解的,如下通过一些代码,将Python的类的一些特性展现出来
类及抽象类
# -*- coding: utf-8 -*-
# Python抽象类的基本模板
from abc import ABCMeta, abstractmethod
# 定义抽象类,继承object
class People(object):
# 定义为抽象类
__metaclass__ = ABCMeta
# 公有变量,静态字段,memo属于Provice这个类,而非某个对象
name = 'marco'
# 私有变量,双下划线开头
__age = 20
def __init__(self, name = 'Mike'):
# 如果不设置setter,则属性为只读
# _name为可读写,而__age为只读
self._name = name
# __前缀表示私有属性,在print中将不再显示,因为print访问不到
self.__age = 20
#析构函数,让对象在销毁(同java,对象的销毁不需要像C++一样,垃圾回收会去执行)时做些什么,可以通过析构函数的方式让其执行
#一般情况是使用不到的
def __del__(self):
print "destory"
# 通过property装饰器,将方法变成一个特性, 访问的时候模拟字段的访问方式
# 可以通过特性的方式访问私有字段(只读)
@property
def Name(self):
print 'get name...'
return self.__age
#可改私有字段, 装饰器格式:方法名.setter
@Name.setter
def Name(self, age):
print 'set name...'
self.__age = age
@property
def Age(self):
print 'get age...'
return self.__age
# 定义抽象方法,子类继承时需实现
@abstractmethod
def sayHello(self):
pass
#私有方法
def __sha(self):
print "alex"
def show2(self):
self.__sha()
# 定义实现类, 继承和实现抽象类和其方法
class Student(People):
def __init__(self, name = 'Leo'):
self.name = name
self.age = 18
def sayHello(self):
print 'Student say hello to you'
#静态方法
#在动态方法前加上python自带的装饰器@staticmethod,就可以将方法变为静态方法,self属于对象,因此静态方法无需带
@staticmethod
def Foo():
print "static method"
s = Student()
print s.name
s.name = "Tom" #因为_name是可读写的
print s.name
s.sayHello()
Student.Foo()
print s.Name #通过特性显示私有属性
#通过特性propery和setter,可以直接修改私有字段
s.Name = 30
print s.Name
#也是可以访问私有的,但是不建议
print dir(s)
print s._People__age
call方法
#-*- coding: utf-8 -*-
class Foo:
def __init__(self):
pass
def __del__(self):
pass
def __call__(self):
print "call"
f1 = Foo() #执行__init__方法
f1() #执行类的__call__方法,类似于一个转发,实际调用执行的是call方法