码迷,mamicode.com
首页 > 编程语言 > 详细

python面向对象(二)

时间:2016-07-01 21:29:55      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

类的成员

类的成员可以分为三大类:字段、方法和属性

技术分享

一、字段

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

  • 普通字段属于对象
  • 静态字段属于
class foo:
    # 字段(静态字段,保存在类里)
    cc = ‘111‘

    def __init__(self):
        # 字段(普通的字段,保存在对象里)
        self.name = ‘mxz‘

    def f1(self):
        print(self.name)
class Province:
    # 静态字段
    country = ‘中国‘

    def __init__(self,name):
        # 普通字段
        self.name = name

# 直接访问普通字段
# 一般情况下自己访问自己字段
# 规则:
#       普通字段只能用对象访问
#       静态字段只能用类去访问(万不得已可以使用对象访问)
hb = Province(‘河北‘)
bj = Province(‘北京‘)
print(Province.country,hb.name)
print(Province.country,bj.name)

# 直接访问静态字段
print(Province.country)

# 静态字段在代码加载时已经创建

二、方法

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

  • 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self
  • 类方法:由调用; 至少一个cls参数;执行类方法时,自动将调用该方法的复制给cls
  • 静态方法:由调用;无默认参数;
class Province:
    # 静态字段
    country = ‘中国‘

    def __init__(self,name):
        # 普通字段
        self.name = name
    # 普通方法 由对象去调用执行(属于类)

    def show(self):
        print(self.name)

    # 静态方法(属于类,由类调用执行,无默认参数)
    @staticmethod
    def f1(a,b):
        print(a,b)

    # 类方法(用到类的时候使用)
    @classmethod
    def f2(cls): # class
        # cls 类名
        # cls() 创建对象
        print(cls)

hb = Province(‘河北‘)
hb.show()
Province.f1(11,22)
Province.f2()

相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。

不同点:方法调用者不同、调用方法时自动传入的参数不同。

三、属性  

Python中的属性其实是普通方法的变种。

属性的基本使用

class Foo:

    def func(self):
        pass

    # 定义属性
    @property
    def prop(self):
        pass
# ############### 调用 ###############
foo_obj = Foo()

foo_obj.func()
foo_obj.prop   #调用属性

由属性的定义和调用要注意一下几点:

  • 定义时,在普通方法的基础上添加 @property 装饰器;
  • 定义时,属性仅有一个self参数
  • 调用时,无需括号

           方法:foo_obj.func()
           属性:foo_obj.prop

class Pager:

    def __init__(self, all_count):
        # 用户当前请求的页码(第一页、第二页...)
        self.all_count = all_count

    @property
    def all_pager(self):
        a1,a2 = divmod(self.all_count,10)
        if a2 == 0:
            return a1
        else:
            return a1 + 1

    @all_pager.setter
    def all_pager(self,value):
        print(value)

    @all_pager.deleter
    def all_pager(self):
        print(‘del‘)


p = Pager(101)
print(p.all_pager)
p.all_count = 102
del p.all_pager

成员修饰符

类的成员有两种形式:

  • 公有成员,在任何地方都能访问
  • 私有成员,只有在类的内部才能方法
class Foo:

    def __init__(self,name):
        self.name = name


    def f1(self):
        print(self.name)

# 公共的 在内部外部都能访问
obj = Foo(‘mxz‘)
print(obj.name)
obj.f1()
class Foo:
    __cc = ‘111‘

    def __init__(self,name):
        self.__name = name


    def f1(self):
        print(self.__name)

obj = Foo(‘mxz‘)
# 私有 只能在内部调用
obj.f1()

类的特殊成员

__init__

构造方法,通过类创建对象时,自动触发执行。

class Foo:

    def __init__(self, name):
        self.name = name
        self.age = 18


obj = Foo(‘哈哈‘) # 自动执行类中的 __init__ 方法

__del__

析构方法,当对象在内存中被释放时,自动触发执行。

class Foo:

    def __del__(self):
        pass

__module__ 和  __class__ 

  __module__ 表示当前操作的对象在那个模块

  __class__     表示当前操作的对象的类是什么

class C:

    def __init__(self):
        self.name = ‘haha‘


print(C.__module__) # 输出模块
print(C.__class__)      # 输出类

__call__

对象后面加括号,触发执行。

class Foo:
    
    def __init__(self):
        pass

    def __call__(self):
        print(‘call‘)

obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

__str__

  如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return ‘%s - %d‘ % (self.name, self.age)

a = Foo(‘m‘,1)
b = Foo(‘n‘,2)
print(a)
print(b)

__dict__

  类或对象中的所有成员

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age
# 获取对象中封装的数据
a = Foo(‘m‘,1)
print(a.__dict__)

__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

class foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __getitem__(self, item):
        print(type(item))
        return 1


    def __setitem__(self, key, value):
        print(type(key),type(value))

    def __delitem__(self, key):
        print(type(key))

obj = foo(‘mxz‘,1)
ret = obj[1:4:2]
print(ret)

obj[1:4] = [1,2,3,4,5]
del obj[1:4]

__iter__ 

用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__ 

class foo:

    def __iter__(self):
        yield 1
        yield 2

obj = foo()
for item in obj:
    print(item)

面向对象其他相关

isinstance(obj, cls)

 检查是否obj是否是类 cls 的对象

class Foo(object):
    pass

obj = Foo()

print(isinstance(obj, Foo))

issubclass(sub, super)

检查sub类是否是 super 类的派生类

class Foo(object):
    pass

class Bar(Foo):
    pass
 
print(issubclass(Bar, Foo))

 

python面向对象(二)

标签:

原文地址:http://www.cnblogs.com/mxzheng/p/5634163.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!