类/对象的属性及方法访问权限总结:
类属性:
- 类可以访问类属性
- 对象也可以访问类属性
对象属性:
- 类不能访问对象属性
- 对象可以访问对象属性
类方法:
- 对象可调用类方法;
- 类可以调用类方法(不需要创建对象即可调用);
对象方法:
- 对象可调用对象方法;
- 类可以调用对象方法(需要传递对象:Person.show(Aa))
静态方法:
- 对象可调用静态方法;
- 类可以调用静态方法
类/对象的属性修改权限总结:
#如果想在类外部使用私有方法或私有属性,可以通过在公有方法中调用私有方法或私有属性,这样在调用这个公有方法时,就会以公有方法的身份间接的访问私有属性和私有方法了
类属性修改:
- 类可以修改类属性
- 对象不能修改类属性(因为修改时相当于动态添加对象属性);
- 类方法可以修改类属性;
- 对象方法可以修改类属性
对象属性修改:
- 对象可以修改对象属性;
- 对象方法可以修改对象属性;
一句话总结:儿子能用父亲的,父亲想用儿子的就要考虑考虑了
为什么要类属性?
可以节省内存空间,不用创建对象直接使用类的属性
代码演示:
class Person(object):
#定义了一个私有类属性,外部不能直接访问
__type="haha"
#定义类属性
country = "china"
def __init__(self):
self.name="zhangsan"
#对象方法
def show(self):
print("这是对象方法")
#类方法
@classmethod
def show_info(cls):
print("这是类方法")
#静态方法:静态方法和当前对象和当前类没有任何关系
@staticmethod
def show_msg():
print("这是静态方法")
#----------------类方法可以修改类属性---------------
@classmethod
def set_type(cls,type):
cls.__type=type
#可以获取类属性的类方法
#在外部通过类方法间接访问私有类属性了,否则在外部无法访问私有类属性的
@classmethod
def get_type(cls):
#调用类属性需要cls关键字(cls代表当前类)
return cls.__type
#---------------对象方法可以修改类属性--------------
#对象方法可以修改对象属性,也可以修改类属性
def instance_set_type(self,type):
self.__class__.__type = type
def instance_get_type(self):
#self.__class__为了获取当前类,相当于cls
return self.__class__.__type
#------------静态方法,不需要当前对象,也不需要当前类,独立存在
@staticmethod
def sum_num(num1,num2):
result=num1+num2
return result
#创建对象
Aa = Person()
#类访问类属性
print(Person.country)
#对象访问类属性
print(Aa.country)
#类不能访问对象属性
#print(Person.name) #AttributeError: type object 'Person' has no attribute 'name'
#对象访问对象属性
print(Aa.name)
#使用对象调用对象方法
Aa.show()
#使用对象调用静态方法
Aa.show_msg()
#使用对象调用类方法
Aa.show_info()
print("-------------------------------")
#类调用类方法
Person.show_info()
#类调用对象方法(需要传递对象,否则报错TypeError: show() missing 1 required positional argument: 'self')
Person.show(Aa)
#类调用静态方法
Person.show_msg()
print("-------------------------------")
#类修改类属性
Person.country = "类修改类属性world"
print(Aa.country)
#对象不能修改类属性
Aa.country = "Canada"
print(Aa.country) #只是增加了一个同类属性同名的对象属性
print(Person.country) #可见类属性并未改变
print("-------------------------------")
#类方法的应用:类方法可以修改类属性
Person.set_type("类方法修改的类属性")
#Aa.set_type("对象使用类方法修改类属性")
#类方法获取当前类属性
print(Aa.get_type())
print("-------------------------------")
#对象方法修改类属性
Aa.instance_set_type("对象方法修改的类属性")
#对象方法获取当前类属性
print(Aa.instance_get_type())
china
china
zhangsan
这是对象方法
这是静态方法
这是类方法
----这是类方法
这是对象方法
这是静态方法
—类修改类属性world
Canada
类修改类属性world
— 类方法修改的类属性
对象方法修改的类属性
- 应用场景:比如设计游戏,帮助界面为静态属性,个人的name通过对象属性记录,最高分通过类属性记录。类方法用于显示最高分,对象方法用于开始当前玩家的游戏。
class Score(object):
topscore=0
def __init__(self,name):
self.name=name
def per_score(self):
print("%s 开始游戏" %self.name)
#在对象方法中重写类属性中最高分
self.__class__.topscore=60
@classmethod
def print_max_score(cls):
#使用类方法获取类属性的值
print("最高分为%s" %cls.topscore)
@staticmethod
def help_info():
print("这是飞机大战游戏")
#显示帮助信息
Score.help_info()
#查看历史最高分
Score.print_max_score()
#创建角色,开始游戏
xiaoming=Score("xiaoming")
xiaoming.per_score()
#查看最高分
Score.print_max_score()
这是飞机大战游戏
最高分为0
xiaoming 开始游戏
最高分为60