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)
类方法与静态方法类方法是类对象所享有的方式,还要用修饰器相同以@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)

