1. 示例属性与类属性
实例属性用于区分不同的实例,每个实例各自拥有,互相独立
类属性是每个实例的共有属性,有且只有一份
class Circle(object):
pi = 3.14 # 类属性
def __init__(self, r):
self.r = r
类属性可以被同名的示例属性覆盖。
2. 方法的访问限制
1. 双下划线
Python 类中如果有属性/方法不希望被外部访问,我们可以在属性/方法命名时以双下划线开头( __ ),那么该属性/方法就不能使用原变量名访问,使得该属性/方法变为本类私有的(伪私有)。
但是,加双下划线__xx 的属性/方法,可以通过“ _类名__xx ”可以访问到属性/方法。
2. 单下划线
以单下划线开头的属性/方法"_xxx",虽然也可以被外部访问,但按照习惯,他们不应该被外部访问
3. classmethod和staticmethod装饰方法
1. @classmethod
类方法,我们不用通过实例化类就能访问的方法。而且@classmethod 装饰的方法不能使用实例属性,只能是类属性。它主要使用在和类进行交互,但不和其实例进行交互的函数方法上。
例子:
class Circle(object):
__pi = 3.14
def __init__(self, r):
self.r = r
@classmethod
def pi(cls):
return cls.__pi
def area(self):
"""
圆的面积
"""
return self.r ** 2 * self.__pi
print(Circle.pi()) # 没有实例化 能直接访问pi() 方法
circle1 = Circle(2)
print(circle1.pi()) # 也可以通过实例访问pi()方法
2. @staticmethod
@staticmethod 和@classmethod非常的相似,但是@staticmethod 不强制要求传递参数(它做的事与类方法或实例方法一样)。
@staticmethod使用在有些和类相关函数,但不使用该类或者该类的实例。如更改环境变量、修改其他类的属性等。
一句话: @staticmethod 修饰的方法是放在类外的函数,我们为了方便将他移动到了类里面,它对类的运行无影响。