您的位置:首页 > 编程语言 > Python开发

python学习第七课 --面向对象

2015-12-11 21:27 489 查看
面向对象class Person(object):      --类 
def __init__(self,name):  --初始化函数  构造方法 self.name = name   --
print ‘---create :’,name
def say_name(self):   --方法
print ‘my name is %s’ %self.name

p1 = Person(‘gf1’) --实例化
p2 = Person(‘gf2’)

p1.say_name() --person.say_name(p1)
p2.say_name() --person.say_name(p2)

应用场景:1.多个函数需要使用共同的值
2.需要创建多个事物,每个事物属性个数相同,但是值不相同
特性:
一、封装 将传进来的变量和类的指针封装在对象中,放在内存里,通过对象直接或self间接来调用变量
 



二、继承 class s(f): 派生类继承了基类里的方法,不用再重复写相同功能的方法
 多继承,派生类可以继承多个基类,寻找方法的方式有 深度优先与广度优先
当类是经典类时,多继承的情况下,深度优先
当类是新式类时,多继承的情况下,广度优先
 如果当前类或者基类继承了object类,则是新式类,否则为经典类
  经典类: class c1: 新式类:class c1(object):
pass pass
class c2(c1): class c2(c1):
pass pass

三、多态 python中没有

成员:
字段 方法和属性




      其中,只有普通字段是封装在对象中,其它都保存在类中,无论有多个对象,它们在内存中只创建一份
字段

普通字段、静态字段  



普通字段由对象访问,静态字段由类访问(对象也可以访问)
能否改静态字段?能

方法  

普通方法  由对象调用,至少一个self参数,执行时,自动将调用该方法的对象 赋给self 静态方法 由类调用,没有默认参数,相当于类内的函数,这样就可以不通过对 象来调用方法而直接通过类来访问这个方法
类方法 由类调用,到少一个cls参数,执行时,自动将调用该方法的类复制 给cls;相当于只能带cls参数的静态方法

class F(object):
def __init__(self,name):
self.name =name
def f1(self):
pass
@classmethod
def f2(cls):
pass
@staticmethod
def f3():
pass

obj = F()
obj.f1()
F.f2()
F.f3()

属性

属性就是普通方法的变种,访问属性时就像访问字段一样1. 属性的基本使用


定义时,在普通方法的基础上添加@property装饰器定义时,仅有一个self参数调用时,不需要括号2. 定义方式
装饰器,即在方法上应用装饰器 @property @方法名.setter @方法名.deleter (获取 修改 删除)静态字段,即在类中定义值为property对象的静态字段字段 = property(方法) class Goods(object):

def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8

def get_price(self):
# 实际价格 = 原价 * 折扣
new_price = self.original_price * self.discount
return new_price

def set_price(self, value):
self.original_price = value

def del_price(self, value):
del self.original_price

PRICE = property(get_price, set_price, del_price, '价格属性描述...')

obj = Goods()
obj.PRICE # 获取商品价格
obj.PRICE = 200 # 修改商品原价
del obj.PRICE # 删除商品原价 它的使用场景可以参考:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186781871161bc8d6497004764b398401a401d4cce000即:当将类中的方法变成属性后,可以利用属性的setter方法来对属性进行赋值,并对值进行一系列的操作,如检查类成员修饰符

公有成员 在任何地方都能访问
私有成员 只有在类内部才能访问  __name
五、类的特殊成员
1.__doc__
class Foo:
""" 描述类信息,这是用于看片的神奇 """
def func(self):
pass
print Foo.__doc__
2.__module__ __class__
__module__ 表示当前操作的对象在哪个模块
__class__表示当前操作的对象属于哪个类
模块的调用:
`-- src
|-- mod1.py
|-- mod2
| `-- mod2.py
`-- test1.py
若在程序test1.py中导入文件夹mod2下的文件mod2.py, 需要在mod2文件夹中建立空文件__init__.py文件(也可以在该文件中自定义输出模块接口);然后使用 from mod2.mod2 import * 或import mod2.mod2. 如果要调用mod2.py中的某个类或或函数xx,则使用from mod2.mod2 import xx3.__init__ 构造方法,在类创建对象中自动执行4.__del__ 析构方法,当对象在内存中被释放时,自动触发执行5.__call__ 对象后面加上括号就会触发这个方法 class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print '__call__' obj = Foo() # 执行 __init__ obj() # 执行 __call__6.__dict__ 类或对象中的所有成员 class Province: country = 'China' def __init__(self, name, count): self.name = name self.count = count def func(self, *args, **kwargs): print 'func' # 获取类的成员,即:静态字段、方法、 print Province.__dict__ # 输出:{'country': 'China', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None} obj1 = Province('HeBei',10000) print obj1.__dict__ # 获取对象obj1 的成员 # 输出:{'count': 10000, 'name': 'HeBei'} obj2 = Province('HeNan', 3888) print obj2.__dict__ # 获取对象obj2的成员 # 输出:{'count': 3888, 'name': 'HeNan'} #通过__dict__ 的值可以间接的修改对象里的字段,其实就是修改了内存里的数据
obj1.__dict__[‘name’] = ‘shangxi’
print obj1.__dict__

7.__str__ 如果定义__str__方法,那么在打印对象名时,就输出该方法的返回值  class Foo: def __str__(self): return 'hello' obj = Foo() print obj  #输出 hello 8.__getitem__ __setitem__ __delitem__ 分别表示获取,设置,删除数据,用于索引操作,如字典(与类中的属性相似?) class Foo(object):  def __getitem__(self, key): print '__getitem__',key    def __setitem__(self, key, value): print '__setitem__',key,value  def __delitem__(self, key): print '__delitem__',key  obj = Foo()  result = obj['k1'] # 自动触发执行 __getitem__  obj['k2'] = 'wupeiqi' # 自动触发执行 __setitem__  del obj['k1'] # 自动触发执行 __delitem__ 9.__getslice__ __setslice__ __delslice__ 用于分片操作,如列表 class Foo(object): def __getslice__(self, i, j): print '__getslice__',i,j def __setslice__(self, i, j, sequence): print '__setslice__',i,j def __delslice__(self, i, j): print '__delslice__',i,j obj = Foo() obj[-1:1] # 自动触发执行 __getslice__ obj[0:1] = [11,22,33,44] # 自动触发执行 __setslice__ del obj[0:2] # 自动触发执行 __delslice__ 10.__iter__ 用于迭代器,列表,字典,元组可以进行for循环,就是内部定义了__iter__ for循环语法内部 obj = iter([11,22,33,44]) while True: val = obj.next() print val 11.__new__ __metaclass__
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息