类成员可以分为三类:字段、方法、属性
所有成员中,只有普通字段保存在实例对象中。创建多少个实例对象,在内存中就有多少个普通字段。其他成员都是在类中一、字段
字段包含普通字段和静态字段,在定义是有区别,本质的区别在于他们内存中保存的位置不同
class TestObj:
# 静态字段
my_class = '五(三)班'
def __init__(self, name):
self.name = name
# 直接通过类访问静态字段
TestObj.my_class
# 访问普通字段
obj = TestObj('李四')
obj.my_class
普通字段和静态字段的归属是不一样的
应用场景:如果累创建对象时,没个对象都有相同的字段,可以使用静态字段
二、方法:普通方法、静态方法、和类方法在内存中都属于类,区别在于调用方式不同
普通方法:
有对象调用,至少一个self参数,执行普通方法时,自动将调用该方法的对象值赋值给self
静态方法:
由类调用,无默认参数
类方法:
由类调用,至少一个cls参数,执行该类方法时,自动将调用该方法的类赋值给cls
class TestObj:
def __init__(self, name)
self.name = name
def get_name():
print("this is ordinaly_funtion")
@classmethod
def class_function(cls):
print("this is class_function")
@staticmethod
def static_function():
print('this is static_function')
# 调用普通方法
p = TestObj()
p.get_name()
# 调用类方法
TestObj.class_function()
# 调用静态方法
TestObj.static_function()
类的方法在内存中只会存一份。不同的是它们在调用的时候,由于调用的对象不同,自动传入的参数也就有所不同
三、属性:Python的属性其实是普通方法的变种
- 1 属性的基本使用
class TestObj:
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
@property
def name()
return self.name
##########
p = TestObj()
p.get_name() # 普通方法调用
p.name # 属性调用
属性的调用需要注意以下几点:
1、 定义时,需要在普通方法上添加一个@property装饰器
2、 定义时,属性仅有一个self参数
3、 调用时,无需括号
属性存在的意义是:访问属性可以制造出和访问字段一样简单的假象,属性是由方法变种而来,如果没有属性,方法可以完全替代
属性的功能是:可以在属性内部进行一系列逻辑运算,将结果返回
- 2、属性的两种定义方式:(1)装饰器(2)静态字段
(1)装饰器:直接在方法上添加@property装饰器
其中装饰器在新式类和经典类中的用法又有差别(继承object基类的为新式类)
# 经典类
class TestObj:
@property
def name(self):
return name
########
p = TestObj()
p.name
# 经典类中使用装饰器只有这一种写法
# 新式类
class TestObj(object):
def __init__(self, name):
self.name = name
@property
def name(self):
return name
@name.setter
def name(self, name):
self.name = name
@name.deleter
def name(self):
self.name = None
############
p = TestObj('李四')
p.name # 自动执行被 @property 修饰的name方法
p.name = '王五' # 自动执行被 @name.setter 修饰的方法,并将值赋给方法的参数
del p.name # 自动执行被 @name.deletter 修饰的方法
可以根据新式类的特点 来进行查询、修改、删除操作
(2)静态字段:在类中使用property构造函数创建类的静态字段
property构造方法中有四个参数
1、第一个参数是方法名,调用 对象.属性 时自动触发
2、第二个参数是方法名,调用 对象.属性 = xxx 时自动触发
3、第三个参数是方法名,调用 del 对象.属性 是自动触发
4、第四个参数是字符串,调用对象.属性.doc,此参数是该属性的描述信息
class TestObj:
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
# 必须两个参数
def set_name(self, name):
self.name = name
def del_name(self):
self.name = None
NAME = property(get_name, set_name, del_name, 'description')
p = TestObj('老王')
p.NAME #调用property中第一个参数的方法
p.NAME = '老李'
del p.NAME
网友评论