类属性
class A:
x = 6
A.x
image.png
- 定义一个类A,A中有个变量x引用的对象是6
- x称之为类A的属性,6称之为属性的值
- A.x称之为调用类属性的方式
- 如果想调用某个类的属性,使用英文的句号.
- 类属性仅与其所定义的类绑定,这种属性本质上就是类中的变量。比如例子中,x是一个变量,也是类A的属性。
- 类属性也称之为
静态变量
或静态数据
。
在Python中万物皆对象,
类也是对象
。对象是有属性和方法的,类也有属性和方法。属性是可以进行增加和删除等操作的。
class A:
x = 6 # 定义一个属性
A.x
A.y = 10 # 增加一个属性
del A.x # 删除以后再调用则报错
A.y = 4 # 修改属性的值
dir(A) # 通过dir查看具体的方法
['__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__']
A.__base__ # 显示父类
A.__dict__ # 以字典的形式显示类的所有属性和值
image.png
image.png
image.png
- 类属性和类进行绑定,可以进行自定义、删除、修改等操作
- 每个类都有特殊的属性,特殊属性不需要修改
创建实例和实例属性
创建实例
创建实例一般通过调用类来进行是实现。之前的例子总,boy实例就是通过调用了Person类来实现的。
class Person: # 定义一个Person类
"""
This is a sample of class # 注释部分
"""
def __init__(self, name): # 初始化函数;传入另一个参数name
self.name = name
def get_name(self):
return self.name # 通过get_name函数返回self.name也就是初始化函数中参数name的值
def color(self, color):
d = { }
d[self.name] = color # 向字典中添加键值name:color对并返回
return d
# 调用Person类
if __name__ == "__main__":
boy = Person("xiaoming") # 利用Person类创建实例boy
print(boy.name)
name = boy.get_name() # 加上括号的称之为方法(函数),调用函数即方法
print(name)
boy_color = boy.color("black")
print(boy_color)
- 类是实例的工厂,一个类可以创建多个实例。
美女肯定不止西施一个,王昭君也是,赵飞燕也是,刘亦菲也是呀
。 - 当类被调用后,就可以创建实例,并检查是否有
__init__
方法。 - 没有则返回实例对象,有则调用,将实例对象作为第一个参数
self
传进去,理解这句话:实例是boy
,当做参数传给self,就是说‘boy.name = name’
init函数
-
__init__()
没有return
语句 ,如果非要写,就写return None
。下面的报错提示语法错误,init不能返回int对象。
image.png
class Person:
def __int__(self, name, lang="python", website="www.baidu.com"): # 属性的另一种定义
self.name = name # name就是函数中传进来参数的值;lang、website相同
self.lang = lang
self.website = website
self.email = "123456@qq.com" # 增加一个属性
- init初始化函数的第一个参数必须是self
- init函数没有返回值
实例属性
与类相同,实例具有的属性称之为
实例属性
。
class A:
x = 6
foo = A() # 根据类A创建一个实例foo,实例foo具有属性
foo.x
image.png
- 实例的属性是可以变化的,能够进行修改;
- 类的属性不能修改,类属性和类进行绑定,不受实例的影响;
foo.x += 1 # 修改实例属性
foo.x # 结果是7
A.x # 结果仍然是6
image.png
-
实例的新属性将原来的覆盖,如果将新属性删除,原来的属性将能够进行访问
image.png -
修改类的属性,实例属性跟着变化
image.png
总结
- 和类属性一样,实例也具有自己的属性
- 实例属性能够进行任意修改
- 实例属性的修改不影响类属性,即类属性不因实例属性而变化
- 类属性能够影响实例属性,因为实例是通过调用类来实现的
特殊情形
当类中变量引用的是一个可变对象,类和实例的属性能够相互影响。
bar.y.append(5) # 修改实例属性
bar.y
B.y # 类的属性跟着改变
[1, 2, 3, 4, 5]
B.y.append(6) # 修改类属性
B.y
bar.y # 实例属性跟着变
[1, 2, 3, 4, 5, 6]
image.png
网友评论