类成员包括
- 字段:普通字段(有self,属于对象)、静态字段(无self,属于类)
- 方法:普通方法(无装饰,形参必须包含self)、静态方法(@staticmethod装饰,不需要self形参)、类方法(@classmethod装饰,必须cls作为形参,参数为类,一般用不到,因为类方法可以用静态方法替代,传入类作为参数)
- 属性:一种只能通过方法名进行调用传参的方法(@property进行装饰)
1. 字段
字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,
普通字段属于对象
静态字段属于类
# 静态字段
country = '中国'
def __init__(self, name):
# 普通字段
self.name = name
# 直接访问普通字段
obj = Province('河北省')
print obj.name
# 直接访问静态字段
Province.country
由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。其在内容的存储方式类似如下图:
由上图可是:
静态字段在内存中只保存一份
普通字段在每个对象中都要保存一份
应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
静态字段通过类名修改则会彻底改变,通过对象修改则只改变当前对象的静态字段
2. 方法
方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
- 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
- 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
- 静态方法:由类调用;无默认参数;
class Foo:
def __init__(self, name):
self.name = name
def ord_func(self):
""" 定义普通方法,至少有一个self参数 """
# print self.name
print '普通方法'
@classmethod
def class_func(cls):
""" 定义类方法,至少有一个cls参数 """
print '类方法'
@staticmethod
def static_func():
""" 定义静态方法 ,无默认参数"""
print '静态方法'
# 调用普通方法
f = Foo()
f.ord_func()
# 调用类方法
Foo.class_func()
# 调用静态方法
Foo.static_func()
方法的定义和使用
相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
不同点:方法调用者不同、调用方法时自动传入的参数不同。
应用场景:
普通方法:依赖对象的值
静态方法:不需要任何对象的值,只需要类名即可调用
类方法:完全可以I用静态方法将本类名传入即可
3. 属性
3.1 属性的建立方式1——@property装饰
class MyClass:
# 静态字段
name = 'zhao'
def __init__(self):
pass
@property
def myper(self):
return MyClass.name
@myper.setter
def myper(self, val):
MyClass.name = val
print(val)
@myper.deleter
def myper(self):
print('delet myper')
obj = MyClass()
print(obj.myper)
obj.myper = 'jun'
print(obj.myper)
del obj.myper
运行结果
3.2 属性的建立方式2——property构造方法
'''属性的建立方法之二:利用property构造函数'''
class MyClass:
def __init__(self):
pass
def get_per(self):
return 'this is myproperty'
def set_per(self, val):
print( 'this is set %s' % val)
def del_per(self):
print('this is del')
myper = property(get_per, set_per, del_per)
obj = MyClass()
print(obj.myper)
obj.myper = 'ren'
del obj.myper
运行结果
4. 成员修饰符
类成员分为两类:私有成员、公有成员
私有成员通过对象无法访问,只能类内部进行调用,子类也无法继承父类的私有成员
4.1 私有字段
'''类静态、普通字段私有成员举例'''
self.__name = 'zhao'
__name = 'zhao'
在原来字段之前加上双下划线即可
4.2 私有方法
同私有字段,只要在三类方法名前面加上双下划线即可。