文章目录
一、类属性与实例属性
1、类属性
(1)类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有。
(2)占用内存:类属性在内存中只存在 一个副本。
(3)作用域:可以通过类名或者对象名来访问
2、实例属性
(1) 即对象属性,它不被所有类对象的实例对象所共有。
(2)占用内存:在内存中的副本个数取决于对象个数,有几个对象,就有几个实例属性。
(3)作用域:只能通过对象名来访问
二、类方法与静态方法
1、类方法
类方法是类对象所拥有的方法,
需要用修饰器一般以@classmethod来标识其为类方法
1). 对于类方法,第一个参数必须是类名cls(形参)
2). 能够通过实例对象和类去访问。
import time
class Date(object):
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def __str__(self):
return '%s-%s-%s' %(self.year, self.month, self.day)
@classmethod
def today(cls):
"""
类方法 @classmethod ,传入类名 Date
:return: 返回 类Date实例化出的对象
"""
now = time.localtime()
return cls(now.tm_year, now.tm_mon, now.tm_mday) # Date() 实例化对象
if __name__ == '__main__':
today = Date.today() # 通过类名直接访问 , today()方法返回当前日期对象
print(today) # 有魔术方法__str__可以友好展示,不然打印出的是一个日期对象 :<__main__.Date object at 0x000001A8CD4B95F8>
2、静态方法
静态方法需要用修饰器一般以@staticmethod来标识其为静态方法,
1). 静态方法不需要传任何参数
2). 能够通过实例对象和类去访问。
三、property类属性
1、定义
一种用起来像是使用的实例属性一样的特殊属性,可以对应于类的某个方法
使用:
定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
调用时,无需括号
2、应用场景
(1)某个属性只能访问不能修改,将类方法转换成类属性
class Date(object):
def __init__(self, year, month, day):
self.__year = year # 定义为私有属性
self.__month = month
self.__day = day
@property # 将该私有属性用@property定义为一个函数,返回,则可以进行查看
def year(self):
return self.__year
@property
def month(self):
return self.__month
@property
def day(self):
return self.__day
if __name__ == '__main__':
dateobj = Date(2020, 1, 1)
print(dateobj.year, dateobj.month, dateobj.day) # 2020 1 1 则可以查看到私有属性
# 虽然year, month, day 都是方法,但是这里调用不用加(), 将类方法转换成了类属性
(2)某一个属性不能直接返回, 需要计算, 可以通过property属性实现
"""
分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一
类属性应用需求: 对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库
中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求
数据时就要显示的指定获取从第start条到第end条的所有数据 这个分页的功能包括:
• 根据用户请求的当前页和总数据条数计算出 start 和 end
• 根据start 和 end 去数据库中请求数据
"""
class Pagintor(object):
def __init__(self,page = 1, per_page = 5):
"""
:param page: 当前展示的页码
:param per_page: 每页显示的数据个数
"""
self