Python 类属性与实例属性,类对象与实例对象用法分析
在Python中,类和实例都有属性这个概念,属性可以是类属性或实例属性。类属性属于类对象,实例属性属于实例对象。在使用类和实例时,对属性的理解和应用是很重要的。本文将详细讲解Python类属性与实例属性、类对象与实例对象的用法及应用。
定义类
我们首先要学习的是如何定义类。在Python中,使用class
关键字定义一个类。类名通常采用Pascal命名法(单词首字母大写),而且通常没有括号。接下来我们来定义一个最基本的类Person
,类中只有一个属性name
。
class Person:
name = "Default Name"
类属性和实例属性
在上面的定义中,我们定义了一个类属性name
,它属于整个类,如果不对它进行修改,所有实例的name
都是"Default Name"
。
接下来,让我们创建一个实例对象。
p = Person()
我们可以通过.
来访问对象的属性和方法,这里我们可以通过p.name
来访问类属性name
。
print(p.name) # 输出 "Default Name"
如果我们想改变实例的name
属性,我们可以通过=
赋值来实现。
p.name = "Tom"
print(p.name) # 输出 "Tom"
现在实例对象p
的name
属性已经变为了"Tom"
,但是类属性name
的值并没有变化,其值仍为"Default Name"
。
print(Person.name) # 输出 "Default Name"
在Python中,实例属性优先于类属性,这就是为什么实例对象p
的name
属性已经被改变,但类属性name
并没有改变。
当我们访问实例属性时,Python会现在实例对象p
中查找是否存在该属性,如果没有找到,则在类属性中查找,如果还是没有找到,则会抛出AttributeError
异常。
p.age # 抛出 AttributeError
类对象和实例对象
在Python中,类也是一个对象,它是type
类的实例对象。而我们通过class
关键字定义的类就是类对象。我们可以在类对象中定义类属性和方法。
class Person:
name = "Default Name"
@staticmethod
def say_hello():
print("Hello!")
我们可以通过.
来访问类对象的属性和方法,这里我们可以通过Person.name
来访问类属性name
,通过Person.say_hello()
来访问静态方法。
print(Person.name) # 输出 "Default Name"
Person.say_hello() # 输出 "Hello!"
我们也可以通过类对象来创建实例对象。
p1 = Person()
p2 = Person()
p1和p2都是Person类的实例对象,它们可以访问类属性和方法,也可以定义自己的实例属性。
print(p1.name) # 输出 "Default Name"
p1.name = "Tom"
print(p1.name) # 输出 "Tom"
print(p2.name) # 输出 "Default Name"
p1.say_hello() # 输出 "Hello!"
p1.age = 20
p2.age = 30
print(p1.age, p2.age) # 输出 20 30
示例1: 计数器
下面我们来看一个示例,学习如何使用类和实例属性来实现计数器。
class Counter:
count = 0
def __init__(self):
self.__class__.count += 1
c1 = Counter()
c2 = Counter()
c3 = Counter()
print(c1.count) # 输出 3
这里我们定义一个类Counter
,类属性count
初始化为0。每当创建一个实例对象时,我们就将类属性count
加1。然后我们分别创建了3个Counter
类的实例对象,然后通过c1.count
来访问类属性count
,输出的值为3,表示我们创建了3个实例对象。
示例2: 标准差
下面我们来看一个更加复杂的示例,学习如何使用类和实例属性来计算一组数的标准差。
class StandardDeviation:
total = 0
squares = 0
count = 0
def __init__(self, value):
self.value = value
self.__class__.total += value
self.__class__.squares += value ** 2
self.__class__.count += 1
def variance(self):
if self.__class__.count == 0:
return 0
return (self.__class__.squares / self.__class__.count) - \
(self.__class__.total / self.__class__.count) ** 2
def std_dev(self):
return self.variance() ** 0.5
sd = StandardDeviation(1)
sd = StandardDeviation(2)
sd = StandardDeviation(3)
sd = StandardDeviation(4)
sd = StandardDeviation(5)
print(sd.std_dev()) # 输出 1.4142135623730951
这里我们定义了一个类StandardDeviation
,类属性total
、squares
、count
分别用来记录总数、平方和、元素个数。在__init__
方法中,我们将实例属性value
加入到total
和squares
中,同时将count
加1。在variance
方法中,我们计算每个元素的方差,std_dev
方法则是计算标准差。
我们分别创建了5个实例对象,并将它们加入到StandardDeviation
这个类的对象中。最终我们计算出了这组数的标准差,输出的值是1.4142135623730951
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 类属性与实例属性,类对象与实例对象用法分析 - Python技术站