成员属性:
成员属性在这里值得是在自己定义的类中的属性,一经实例化就会成为实例特有的属性
例如:
class Person:
def __init__(self,name,age,gender,address):
self.name=name
self.age=age
self.gender=gender
self.address=address
tom=Person('tom',23,'男','美国')
jerry=Person('jerry',22,'男','美国')
print(tom.name)print(jerry.name)
#输出结果
tom
jerry
从上述代码中我们可以看到,我们通过定义了一个Person的类,实例化了两个对象tom和jerry。我们通过这两个对象去使用name的时候发现,他们输出的结果不同.这里的name就是成员变量/属性了。因为在我们实例化对象的时候,通过传参,我们把类中的self.name设置成了当前类的私有属性。
这时的name就成了对应对象的成员属性/变量了
实例属性/变量
还是上述的代码,这时我们在类外面通过对象引用一个类中没有声明的变量会有结果呢?
class Person:
def __init__(self,name,age,gender,address):
self.name=name
self.age=age
self.gender=gender
self.address=address
tom=Person('tom',23,'男','美国')
jerry=Person('jerry',22,'男','美国')
tom.nickname='汤姆'
print(tom.nickname)
#输出结果
汤姆
从上述代码中我们看到,当对象调用一个类中没有声明的变量的时候,并给变量赋值,结果是可以正常输出,那么这时jerry中能不能直接使用nickname呢?我们来试试
class Person:
def __init__(self,name,age,gender,address):
self.name=name
self.age=age
self.gender=gender
self.address=address
tom=Person('tom',23,'男','美国')
jerry=Person('jerry',22,'男','美国')
tom.nickname='汤姆'
print(tom.nickname)print(jerry.nickname)
#输出结果
汤姆
Traceback (most recent call last): File "C:/Python36/ttt.py", line 13, in
print(jerry.nickname)AttributeError: 'Person' object has no attribute 'nickname'
我们看到,当我们直接使用nickname的时候,程序出错,告诉我们类Person中没有nickname这个属性。
这时,在tom中就有了nickname这个属性,而jerry中则没有nickname。从中我们可以得知,这时的nickname是tom这个对象所特有的属性/变量,并且这个属性独立于类型之外。这时的nickname就是对象/实例的实例属性/变量。在现实情况下,对象中可以存在从类中实例化的属性,也可以自己声明自己特有的属性。
类属性
类属性是定义声明在类中的一种属性,不同于成员属性。类属性是所有实例化对象共同的属性,并且可以直接使用类调用使用
例如:
class Person:
def __init__(self,name,age,gender,address):
self.name=name
self.age=age
self.gender=gender
self.address=address
tom=Person('tom',23,'男','美国')
jerry=Person('jerry',22,'男','美国')
print(tom.num,jerry.num,Person.num)
tom.num=30
print(tom.num,jerry.num,Person.num)
Person.num=40
print(tom.num,jerry.num,Person.num)
#输出结果
20 20 20
30 20 20
30 40 40
在上面,我们在类Person中,声明了一个没有带self 的变量num。在实例化的两个对象tom,jerry中都能使用,甚至我们还可以直接使用类去调用这个变量/属性,这时的num就是类Person的类属性/变量。
并且,我们还过修改num的值可以看出,当使用对象去改变num的值时,此时的num变成了tom对象中的实例变量/属性了,而通过类调用改变num的值,此时的num的值才发生改变。
总结
通过前面的代码演示,我们可以得出
成员属性是在类声明定义好的属性,通过self进行封装在类中,经过实例化对象后,成为对象特有的属性。
实例属性是没有经过类的声明定义,直接在对象中去声明,引用的变量,是当前对象不同与其他对象(通过相同类实例化的对象)的属性。它独立于类之外,只属于当前对象。
类属性是在类中声明定义的变量,但是不同于成员属性,类属性没有经过self封装而直接定义的。所以类属性只属于当前类,实例化的对象只能调用而不能修改。类属性只能通过类本身修改