类的构成包括成员属性和成员方法(数据成员和成员函数)
类的方法,有这么几个种:类方法、静态方法和实例方法。
类的属性也分为两种:一种是实例化属性,一种是类属性。
类的方法
类方法:
@classmethod # 类方法 需要cls参数,代表调用该函数的类.一般是用来访问类属性的
静态方法
@staticmethod # 静态方法:静态方法只在内存中生成一个,节省开销(也叫类的工具包)。
实例方法
def f3(self): # 实例方法需要self参数,代表调用该函数的实例
类属性
类属性对于所有的实例是公用的,与实例无关,一般定义在类中方法以外,当然类属性也可以定义在方法内的,
类属性是定义在类层面的,因此类属性要比实例属性作用域范围要广一些。
实例属性是与实例绑定的,只与实例有关,在类层次上是看不到的,
定义在类实例方法内。实例属性使用实例对象定义,而且对于每个实例化对象都是独立存在的。
在方法中定义的属性与方法外定义的属性略有不同。在方法外定义的类属性(count、lst),
只要类定义完成就已经生成;而在方法内定义的类属性,需要调用方法之后才会生成。也就是要实例化
使用类名称修改类属性
使用类名称修改类属性之后,不管用类名称还是实例名称调用类属性,
都是一样的,说明修改的的确是类属性。
使用类的实例化对象修改类属性
可变类型可修改,不可变类型不可修改
"""
类的构成包括成员属性和成员方法(数据成员和成员函数)
类的方法,有这么几个种:类方法、静态方法和实例方法。
类的属性也分为两种:一种是实例化属性,一种是类属性。
"""
# 定义一个类
class MyClass:
i = "MyClass类属性 i"
def __init__(self):
self.i=‘实例化属性 i‘
@classmethod # 类方法 需要cls参数,代表调用该函数的类.一般是用来访问类属性的
def f1(cls):
return cls.i
@staticmethod # 静态方法:静态方法只在内存中生成一个,节省开销(也叫类的工具包)。
def f2(i):
return i
def f3(self): # 实例方法需要self参数,代表调用该函数的实例
return self.i
# 定义另一个类
class b:
i="class b 的类属性"
def f1(self):
return self.i
# 实例化类
x = MyClass() # 实例方法
# 方法调用效果
print("MyClass 类的方法 f1 输出为:", MyClass.f1())
print("MyClass 类的方法 f1 输出为:", x.f1())
print("MyClass 类的方法 f2 输出为:", MyClass.f2(2))
print("MyClass 类的方法 f2 输出为:", x.f2(5))
print("MyClass 类的方法 f3 输出为:", x.f3())
print("MyClass 类的方法 f3 输出为:", MyClass.f3(x))
# 鸭子类型的表现
print("MyClass 类的方法 f3 输出为:", MyClass.f3(b))
print(" b 类的方法 f1 输出为:", b.f1(MyClass))
print(" b 类的方法 f1 输出为:", b.f1(x))
# 类的属性
class C:
"""
变量 x 和 words 是实例属性
count、lst、say是类属性。
"""
count=0
lst=[1,2,3]
def __init__(self, num = 0):
self.x = num
C.count += 1
if C.count>3:
C.say="好多实例对象啊!"
else:
C.say="实例对象好孤单啊!"
def fprint(self,string):
self.words=string
print(self.words)
# 实例属性是与实例绑定的,只与实例有关,在类层次上是看不到的,
# 定义在类实例方法内。实例属性使用实例对象定义,而且对于每个实例化对象都是独立存在的。
a = C(5)
a.x # 5
a.fprint("a说,我是第一个实例对象")
a.words
# 每个实例化对象的属性都是独立的
c = C()
c.x # 0
c.y =2
c.y # 2
# a.y # ‘C‘ object has no attribute ‘y‘
# 类属性
"""
类属性对于所有的实例是公用的,与实例无关,一般定义在类中方法以外
当然类属性也可以定义在方法内的,
类属性是定义在类层面的,因此类属性要比实例属性作用域范围要广一些。
这里, count 和 lst 就是直接定义在类中方法以外的类属性,类属性通过类名调用。
"""
# 直接使用类名称调用类属性
C.lst # [1,2,3]
C.count # 3
C.say
print("实例调用与类名调用属性")
d = C(1) # # 实例化之后原来的属性值改变
d.say
C.say
"""
在方法中定义的属性与方法外定义的属性略有不同。在方法外定义的类属性(count、lst),
只要类定义完成就已经生成;而在方法内定义的类属性,需要调用方法之后才会生成。也就是要实例化
"""
# 使用类名称修改类属性
"""
使用类名称修改类属性之后,不管用类名称还是实例名称调用类属性,
都是一样的,说明修改的的确是类属性。
"""
C.count = 9
c.lst[1] = 5
C.count
C.lst
# 使用类的实例化对象修改类属性
# 可变类型可修改,不可变类型不可修改