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

一、字段
字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,
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)
# 静态字段在代码加载时已经创建
二、方法
方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
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 #调用属性
由属性的定义和调用要注意一下几点:
方法: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))
标签:
原文地址:http://www.cnblogs.com/mxzheng/p/5634163.html