关于Python类相关的一些基础总结,很基础的东西!
1. 测试META与hasattr():
class ClassTest(object):
username = 'fxx'
def test_has_attr(self):
if hasattr(self, 'username'):
print('我有username属性!')
else:
print('我没有该属性!')
class Mata:
model = 'fxx'
class Meta:
model = 'gxx'
def test_meta(self):
print(self.Meta.model)
print(self.Mata.model)
test = ClassTest()
test2 = ClassTest
print(type(test)) # <class '__main__.ClassTest'>
print(id(test)) # 4518266920
print(type(test2)) # <class 'type'>
print(id(test2)) # 140500879331320
print(id(ClassTest)) # 140500879331320
test.test_meta() # gxx fxx
test.test_has_attr() # 我有username属性!
2. 属性方法、类方法、静态方法
class TestMethod(object):
"""测试实例方法、类方法和静态方法"""
def attr_method(self):
print('我是实例方法!')
@classmethod
def class_method(cls):
print('我是类方法!')
@staticmethod
def static_method():
print('我是静态方法!')
print(isinstance(test_method, TestMethod)) # True
test_method = TestMethod()
test_method.attr_method() # 我是实例方法!
test_method.class_method() # 我是类方法!
test_method.static_method() # 我是静态方法!
TestMethod.class_method() # 我是类方法!
TestMethod.static_method() # 我是静态方法!
TestMethod.attr_method(test_method) # 我是实例方法!
TestMethod.attr_method() # TypeError: attr_method() missing 1 required positional argument: 'self'
- 实例方法传入的参数为一个实例对象,因此只有对象才可以调用,如果使用类直接调用实例方法,需要显式地将实例作为参数传入。
- 类方法传入的参数为该方法前面的类,由 isinstance(test_method, TestMethod) = True 可知,实例对象和类其实属于同种类型,因此对象和类都可以调用类方法。
- 静态方法不需要传入对象或者类,因此类和对象都可以调用。
3. 关于多重继承和继承顺序
如果继承的两个类都同时定义了一个方法,继承后,会得到哪一个方法?
其中一个类(GenericAPIView(APIView(View)))定义了一个方法as_view(),另一个类(ViewSetMixin)重写了as_view(),他们先后顺序的关系?