类对象、类属性与实例对象、实例属性的区别
在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性。类属性在内存中只有一份,在__init__外部定义。
通过类创建的对象称为实例对象,描述实例对象的属性称为实例属性。实例属性在各自对象的内存中都保存一份,在__init__方法内部定义。
class Province(object):
# 类属性
country = '中国'
def __init__(self, name):
# 实例属性
self.name = name
# 创建一个实例对象
obj = Province('山东省')
# 直接访问实例属性
print(obj.name)
# 直接访问类属性
Province.country
实例对象里面修改类属性: obj1.__class__.county = '香港'
实例方法、类方法、静态方法的区别
这三种方法都是保存在类的内存中,调用者不同。
- 实例方法由对象调用,至少一个self参数,self代表对象的引用。
- 类方法有类调用,至少一个cls参数,并且需要装饰器@classmethod修饰。
- 静态方法由类调用,不需要参数,需要装饰器@staticmethod修饰。
创建原则:
- 只要访问了成员变量的方法都叫实例方法
- 只访问类变量的方法叫类方法
- 既不访问成员变量,也不访问类变量的方法叫成静态方法
class Car(object): # 类对象
car_num = 0 # 类属性,在__init__外部定义。
def __init__(self, brand, price):
self.brand = brand # 实例属性,在__init__内部定义
self.price = price
Car.car_num += 1
def level(self): # 实例方法,调用了实例属性
if self.price > 300000:
print(f"{self.brand}是高级轿车")
else:
print(f"{self.brand}是非高级轿车")
@classmethod
def car_count(cls): # 类方法,只访问类变量
print(f"我有{cls.car_num}辆车")
@staticmethod
def tips(): # 静态方法,既不访问成员变量,也不访问类变量
print("温馨提示:开车不喝酒")
if __name__ == "__main__":
bmw = Car("宝马", 200000) # 通过类创建的对象称为实例对象
bmw.level()
wlhg = Car("五菱宏光", 400000)
wlhg.level()
Car.car_count() # 调用类方法
Car.tips() # 调用静态方法
静态方法既不访问成员变量,也不访问类变量,若写个和class同级别的def函数也能实现同样的功能,何必定义个静态方法呢?定义静态方法主要是规避两个模块调用同名函数的情况,
property 模块:调用property属性,不用写括号,把原来的调用实例方法看上去像调用一个实例属性
class Foo:
def func(self):
pass
# 定义property属性
@property
def prop(self): # 只能有一个self,不能有其他参数
return 100
foo_obj = Foo()
foo_obj.func() # 调用实例方法
ret = foo_obj.prop # 调用property属性,不用写括号,把原来的调用实例方法看上去像调用一个实例属性
print(ret)
翻页demo
class Pager:
def __init__(self, current_page):
# 用户当前请求的页码(第一页、第二页...)
self.current_page = current_page
# 每页默认显示10条数据
self.per_items = 10
@property
def start(self):
val = (self.current_page - 1) * self.per_items
return val
@property
def end(self):
val = self.current_page*self.per_items
return val
p = Pager(1)
p.start
p.end