文章目录
装饰器
@staticmethod(静态方法)
如果需要不调用类而直接调用类的成员方法,一般会使用类静态方法@staticmethod,加了这个修饰器后,可以不用传递self参数,也可以在类不进行实例化的情况下调用。
@staticmethod 静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包
放在函数前(该函数不传入self或者cls),所以不能访问类属性和实例属性
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
我对Person类进行了两次实例化,每次计数变量++,利用类方法实现:
@classmethod描述类方法,然后用"cls"代表本类。
类方法对类属性进行的处理是有记忆性的。
类方法处理的变量一定要是类变量
因为在类方法中用不了self来寻址实例变量
,所以需要把类变量
放到最前面描述
@property(属性)
property 是 Python 内置的功能,常用来修饰类方法,用于已访问属性的方式调用函数。
# 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
单下划线:
表示 (protected)保护类型成员,只允许类本身和子类进行访问
__foo
双下划线:
表示 (private)私有类型成员,只允许定义该方法的类本身进行访问,而且不能通过类的实例进行访问,但是可以通过“类的实例名.类名__xxx”方式访问
__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)