文章目录
装饰器
@staticmethod(静态方法)
class Time():
def __init__(self,sec):
self.sec = sec
#声明一个静态方法
@staticmethod
def sec_minutes(s1,s2):
#返回两个时间差
return abs(s1-s2)
t = Time(10)
#分别使用类名调用和使用实例调用静态方法
print(Time.sec_minutes(10,5),t.sec_minutes(t.sec,5))
#结果为5 5
@classmethod(类方法)
类方法让类模板具有记忆力
在普通情况下,不使用类方法对类进行实例化,类本身是不具有记忆性的。只是当一个静态模板被套用多次而已。
class Person:
cnt = 0 # 类变量
def __init__(self, name):
self.name = name
cnt = self.create()
@classmethod
def create(cls):
cls.cnt += 1
return cls.cnt
a = Person('A')
print(a.cnt)
b = Person('B')
print(b.cnt)
1
2
== 类方法处理的变量一定要是类变量 ==
因为在类方法中用不了self来寻址实例变量
,所以需要把类变量
放到最前面描述
@property(属性)
# http://c.biancheng.net/view/4561.html (@property的讲解)
class rect:
def __init__(self, area):
self.__area = area
@property
def getarea(self):
return self.__area
@getarea.setter
def getarea(self, val):
self.__area = val
@getarea.getter
def getarea(self):
return self.__area
@getarea.deleter
def getarea(self):
self.__area = -1
r = rect(23)
print(r.getarea)
r.getarea = 20
print(r.getarea)
del r.getarea
print(r.getarea)
23
20
-1
访问限制
_foo
单下划线:
__foo
双下划线:
foo
首尾双下划线:
属性(@property)
通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。可直接通过方法名来访问方法。
添加安全保护机制
python默认情况下,创建的类属性或者实例是可以在类体外进行修改的(动态的),如果要限制不在类体外修改,则可将其设置为私有的,但这样在类体外不能获取它的值。
@property:可以实现创建一个可以读取但不能修改的属性
想要实现修改属性,需要给属性添加 setter 方法,即 setter 装饰器(@方法名.setter)
class test:
def __init__(self, a):
self.__a = a
@property
# @property 修饰 get方法, 使得该方法变成get属性的getter方法
def get(self):
return self.__a
如下,则size属性变为了可读、可修改的属性。
class A:
def __init__(self, x):
self.__x = x
@property
def size(self):
return self.__x
@size.setter
def size(self, value):
self.__x = value
python的class(类)中的object是什么意思?
继承object对象的话就拥有了好多可操作对象,这些都是类中的高级特性。
class A:
x = 1
class B(object):
x = 1
print ("A", "['__doc__', '__module__', 'name']")
print ("B", dir(B))
我环境python3的,所以在此只做演示
A ['__doc__', '__module__', 'name']
B ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x']
实际上在python 3 中已经默认加载了object(即便没有写上object)