前言:
方法:方法是动态的是对象的行为,比如一个人可以跑,跳,是指具体做了什么动作或者行为
属性:属性是固有的是对象本身多携带的比如一个人的年龄,名字
类属性和实例属性
1.类属性就相当于全局变量是类对象和实例对象所共有的属性
2.实例对象的属性为实例对象所私有的
class Test(object):
Lx = 'python'
__age = 27
def __init__(self,age):
self.age = age
pass
test = Test(20)
print(test.age) # 实例对象查看实例属性 正常访问
print(test.Lx) # 实例对象查看类属性 正常访问
print(Test.Lx) # 类对象查看类属性 正常访问
print(Test.age) # 类对象查看实例属性,这里会报错
print(test.__age) #错误,不能在类外通过实例对象访问私有的类属性
print(Test.__age) #错误,不能在类外通过类对象访问私有的类属性
#运行结果
20
python
python
------报错------
------报错------
------报错------
综上:
1.类对象可以访问类属性
2.类对象不能访问实例属性
3.实例对象可以访问实例属性和类属性,和类属性是包含关系
类方法和实例方法对比
1.类方法:类对象所拥有的方法,需要用装饰器@classmethod来标识其为类方法,类方法的第一个参数必须是类对象,类方法可以通过类对象和实例对象调用,类似与类属性可以被类对象和实例对象调用一样
2.实例方法:实例方法的第一个参数是实例对象self,通过self引用类属性或者实例属性,但是在相同名称的类属性和实例属性中,会先调用实例属性,因为实例属性优先级更高
class Test:
name = 'Lx'
# 类方法 用classmethod来装饰
@classmethod
def quety_name(cls):
return cls.name # 访问类属性
@classmethod
def change_name(cls,info):
cls.name=info # 在类方法中修改类属性
return cls.name
@classmethod
def get_name(cls):
return Test.name # 通过类对象引用类属性
print(Test.quety_name()) # 类对象调用类方法
print(Test.change_name("kobe")) # 类对象修改类属性
print(Test.get_name()) # 类对象调用类属性
test = Test()
print(test.change_name('James')) # 实例对象调用类方法
输入结果
Lx
kobe
kobe
James
注意点:
1…cls 指向 类对象(也就是Test)
2.一般以cls作为第一个参数,cls 也可以是其他名称,但是一般默认为cls
静态方法:
1.静态方法不需要额外定义参数,所以在静态方法中引用类属性的话,必须使用类对象的方法来引用
2.Python中的静态方法与python类级别的方法极为相似,不同之处在于静态方法绑定到一个类而不是该类的对象。这意味着可以在没有该类对象的情况下调用静态方法。 这也意味着静态方法无法修改对象的状态,因为它们没有绑定到对象。
创建静态方法有两种方式:
第一种:
class Test:
def get_result(x,y):
result = x + y
return result
Test.get_result = staticmethod(Test.get_result)
print("result:",Test.get_result(1,2))
输出
result: 3
第二种:
class Test:
@staticmethod
def get_result(x,y):
result = x + y
return result
print("result:",Test.get_result(1,2))
输出
result: 3
1.静态方法有一个非常明确的用例。 当我们需要某些功能而不是对象,而需要完整的类时,我们可以使方法静态化。 当我们需要创建Utility方法时,这是非常有利的,因为它们通常与对象生命周期无关。
2.请注意,在静态方法中,我们不需要将self作为第一个参数传递。
# 打印当前系统时间
import time
class Time:
@staticmethod
def showTime():
return time.strftime("%H:%M:%S",time.localtime())
pass
print(Time.showTime())