python学习之面向对象高级特性

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

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)

类方法与静态方法br/>类方法是类对象所拥有的方法,需要用修饰器一般以@classmethod来标识其为类方法,
1). 对于类方法,第一个参数必须是类对象,作为第一个参数
(cls是形参, 可以修改为其它变量名,但最好用‘cls‘了)
2). 能够通过实例对象和类对象去访问。br/>类方法与静态方法
静态方法需要用修饰器一般以@staticmethod来标识其为静态方法,
1). 静态方法不需要多定义参数
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)

python学习之面向对象高级特性

原文地址:https://blog.51cto.com/13810716/2463098

时间: 2024-10-06 22:55:27

python学习之面向对象高级特性的相关文章

python学习_day24_面向对象三大特性之继承

一.继承的定义 继承在python中是创建一种新类的方法,新建的类可以继承一个或者多个父类,其中父类称为超类或者基类,新建的类称为派生类或者子类.继承表达的是什么是什么的关系,如:高桌子低板凳都是木头,他大舅他二舅都是他舅. 1.继承实例 如下例,定义了两个类:Dog和Cat类,他们都其都有相同吃.喝.睡的特性. #狗 class Dog: def eat(self): print('eating') def drink(self): print('drinking') def sleep(se

Python学习笔记4 高级特性_20170618

# 切片(获取list / tuple / 字符串 中指定的元素) l = list(range(10)) l[0:3] l[:3] # 0可以省略 l[:] # 全部 l[3:] # 最后的可以省略 l[-2:-1] # 负数下标,见python笔记2中介绍 l[-10:] # 取最后10个数 l[::2] # 所有数,每个两个取出 # 迭代 通过 for ... in ... 可迭代对象:list.tuple.字符串已经在pythonb笔记2中提到了. 判断是否可迭代 from collec

python学习笔记(三) - 高级特性

一. 切片 切片操作和java中的subList类似,就是获取一个子列表 比如L=['zhangsan','lisi','wangwu'] 那么L[0, 2]表示从索引0开始取,直到索引2(不含2), 正好2个元素.如果第一个索引为0, 还可以省略. 下面我们创建一个0-99的数列: L = range(100) 1. 获取前10个数: L[:10] 2. 获取后10个数: L[-10:]    # 倒数第一个元素的索引是-1 3. 获取前11-20个数: L[10:20] 4. 获取前10个数

Python学习笔记——面向对象编程

接下来学习面向对象编程,基础的就不记录了,只记录一些Python特有的或者高级的特性. http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318645694388f1f10473d7f416e9291616be8367ab5000 1. 类的定义 定义类使用class关键字,后面紧跟类名(首字母大写),接着是从哪个类继承下来的(所有类最终会继承object). 通过类名加参

Python学习笔记-面向对象

一.什么是面向对象的程序设计 1.面向过程的程序设计 面向过程:核心是过程二字,过程即解决问题的步骤,就是先干什么,再干什么.基于该思想写程序就好比在设计一条流水线,是一种机械式的思维方式. 优点:复杂的过程流程化,进而简单化 缺点:扩展性差 2.面向对象的程序设计 面向对象:核心是对象二字,对象是特征与技能的结合体.基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是一种"上帝式"的思维方式 优点:可扩展性强 缺点:编程复杂度高,容易出现过度设计问题 二.类与对象 对象

python学习笔记--面向对象的编程和类

一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模型.一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法. 对象:object对象,也就是指模型造出来的具体的东西.一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每

python基础之面向对象高级编程

面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有

Spring框架学习[IoC容器高级特性]

1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取被管理的Bean时,IoC容器对Bean进行的初始化和依赖注入过程,这些是Spring IoC容器的基本功能特性.Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化.FactoryBean产生或者修饰Bean对象的生成.IoC容器初始化Bean过程中使用Bean

Python学习之==>面向对象编程

一.面向对象与面向过程 面向对象与面向过程是两种不同的编程范式,范式指的是按照什么方式去编程.去实现一个功能.不同的编程范式本质上代表对各种不同类型的任务采取不同的解决问题的思路. 1.面向过程编程 角色是执行者,把一个项目按照一定的顺序,从头到尾一步步执行下去.这种思想好理解,但只要前面一个步骤变了,后面的步骤也要跟着变,维护起来比较麻烦. 2.面向对象编程 角色是指挥者,把一个项目分成一个个小的部分,每个部分负责一方面的功能,整个项目由这些部分组合而成一个整体.类似一个机关,分为各个职能部门