python学习之面向对象高级特性
admin
2023-01-21 07:22:39
0

类属性与实例属性
类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在
一个副本。
在前面的例子中我们接触到的就是实例属性(对象属性),它不被所有类对象的实
例对象所共有,在内存中的副本个数取决于对象个数。

05_类属性鱼实例属性.py

import random
class Turtle(object):
    # power是类属性。
    power = 100
    def __init__(self):
        # x,y:实例属性.
        self.x = random.randint(0, 10)
        self.y = random.randint(0, 10)
#1). 类属性不管有多少个对象, 都只存储一份。 实例属性存储的个数取决于实例的个数.
#2). 作用域不同:
#       类属性: 通过类名/对象名来访问
#       实例属性: 只能通过对象名来访问。
print(Turtle.power)
turtle1 = Turtle()
print(turtle1.power, turtle1.x, turtle1.y)

类方法与静态方法类方法是类对象所拥有的方法,需要用修饰器一般以@classmethod来标识其为类方法,
br/>类方法是类对象所拥有的方法,需要用修饰器一般以@classmethod来标识其为类方法,
(cls是形参, 可以修改为其它变量名,但最好用'cls'了)
2). 能够通过实例对象和类对象去访问。类方法与静态方法
静态方法需要用修饰器一般以@staticmethod来标识其为静态方法,
br/>类方法与静态方法
静态方法需要用修饰器一般以@staticmethod来标识其为静态方法,
2). 能够通过实例对象和类对象去访问。

"""

06_类方法和静态方法.py

1). @classmethod: 类方法
2). @staticmethod:静态方法
"""

import random
class Turtle(object):
    def __init__(self):
        # x,y:实例属性.
        self.x = random.randint(0, 10)
        self.y = random.randint(0, 10)
        self.power = 100

    #默认情况下, Python解释器会自动将对象传递给类里面定义的方法。
    def eat(self):
        print("self: ", self)
        self.power += 20
    @classmethod
    def cls_example(cls):
        print("cls: ", cls)

    @staticmethod
    def static_example():
        print("静态方法.......")
turtle = Turtle()
turtle.eat()
turtle.cls_example()
turtle.static_example()
#类方法能够通过实例对象和类对象去访问。
Turtle.cls_example()
#静态方法能够通过实例对象和类对象去访问。
Turtle.static_example()

07_类方法和静态方法的应用.py

import time

''''''
#系统自带date类的使用
from datetime import date

dateObj = date(2019, 10, 10)
print(dateObj)
print(date.today())
"""

class Date(object):
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def __str__(self):
        return "%s-%s-%d" % (self.year, self.month, self.day)

    @classmethod
    def today(cls):
        """
        返回当前的日期对象
        cls: 类名称Date
        :return: Date实例化的对象名称
        """
        #获取当前的时间, 返回的是命名元组的格式
        #time.struct_time(tm_year=2019, tm_mon=12, tm_mday=29, tm_hour=16, tm_min=49, tm_sec=32, tm_wday=6, tm_yday=363, tm_isdst=0)
        now = time.localtime()
        return cls(now.tm_year, now.tm_mon, now.tm_mday)

    def is_leap(self):
        """
        判断是否为闰年?
        一个闰年就是能被4整除但是不能被100整除 或者 year能被400整除.
        :return:
        """
        return (self.year % 4 == 0 and self.year % 100 != 0) or (self.year % 400 == 0)

if __name__ == '__main__':
    # 获取当前日期, today是当前日期对象。
    today = Date.today()
    #打印日期对象, 返回字符串'2019-12-29', 因为有__str__魔术方法。
    print(today)
    #判断是否为闰年?
    print("今年是否为闰年? ", today.is_leap())

    #dateObj = Date(2019, 10, 10)
    #print(dateObj)

property类属性
什么是property属性?
一种用起来像是使用的实例属性一样的特殊属性,可以对应于类的某个方法。
property属性的定义和调用要注意一下几点:

  1. 定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
  2. 调用时,无需括号
    类属性应用需求: 对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库
    中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求
    数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:
    • 根据用户请求的当前页和总数据条数计算出 m 和 n
    • 根据m 和 n 去数据库中请求数据
    property属性的有两种方式:
    • 装饰器 即:在方法上应用装饰器
    • 类属性 即:在类中定义值为property对象的类属性
    注意:
    • 经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法
    • 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方
    法名.setter、@方法名.deleter修饰的方法

    08_property类属性.py

from datetime import date

class Date(object):
    def __init__(self, year, month, day):
        self.__year = year
        self.__month = month
        self.__day = day

    #功能一: 将类方法转换成类属性
    #应用场景: 某个属性只能访问不能修改时使用。
    @property
    def year(self):
        return self.__year

    @property
    def month(self):
        return self.__month

    @property
    def day(self):
        return self.__day

    def __str__(self):
        return "%s-%s-%d" % (self.__year, self.__month, self.__day)

if __name__ == '__main__':
    dateObj = Date(2019, 12, 12)
    print(dateObj.day)
"""
# 08_property类属性.py

from datetime import date

class Date(object):
    def __init__(self, year, month, day):
        self.__year = year
        self.__month = month
        self.__day = day

    #功能一: 将类方法转换成类属性
    #应用场景: 某个属性只能访问不能修改时使用。
    @property
    def year(self):
        return self.__year

    @property
    def month(self):
        return self.__month

    @property
    def day(self):
        return self.__day

    def __str__(self):
        return "%s-%s-%d" % (self.__year, self.__month, self.__day)

if __name__ == '__main__':
    dateObj = Date(2019, 12, 12)
    print(dateObj.day)

相关内容

热门资讯

台防务部门呼吁通过所谓无人机条... 7月22日上午,国台办举行例行新闻发布会。记者:据报道,台防务部门负责人近日称,呼吁通过行政部门无人...
英媒:为什么世界更相信中国而不... 当下西方世界深陷信任危机,民众对体制普遍失望愤怒。美国全球公信力持续崩塌,多国对华信任度已反超美国。...
“台青e家”平台上线运行,国台... 7月22日,国务院台办举行例行新闻发布会。有记者问:在海峡两岸青年文化月活动期间,国务院台办主任宋涛...
视频丨从“有学上”到“上好学”... 教育强国,基点在基础教育。我国拥有43万所中小学幼儿园、2.2亿在校生、1577万专任教师,建成了世...
“看到这几张脸生理性厌恶!”你... 近期,“对AI脸感到不适”相关话题接连冲上社交平台热搜。打开短视频平台刷微短剧,连续刷几部后,主角个...
今年上半年全国城镇新增就业69... 今天(22日)上午,人力资源社会保障部举行新闻发布会。今年上半年,全国城镇新增就业695万人,同比持...
委内瑞拉强震遇难人数升至534... 当地时间21日,委内瑞拉全国代表大会主席豪尔赫·罗德里格斯通过社交媒体通报,该国6月24日两次强震造...
高考684分花3000元咨询进... 潮新闻客户端 青年特约评论员 曾耀湘图源:视觉中国近日,据齐鲁晚报报道,河北一名2018级考生,因“...
郑州2死2伤火灾系人为纵火 郑州市公安局金水分局对外发布案件通报。通报显示,6月19日21时,郑州市金水区宏明路与柳林路东南角宏...
29岁成都小伙旅行中改道广西救... 7月14日,自发赶往广西救灾的志愿者党鑫蕊,由于劳累过度导致心功能衰竭,在贵港市覃塘区不幸离世,年仅...