Python类属性、类方法与对象属性、对象方法的互相访问权限总结

类/对象的属性及方法访问权限总结:

类属性:

  • 类可以访问类属性
  • 对象也可以访问类属性

对象属性:

  • 类不能访问对象属性
  • 对象可以访问对象属性

类方法:

  • 对象可调用类方法;
  • 类可以调用类方法(不需要创建对象即可调用);

对象方法

  • 对象可调用对象方法;
  • 类可以调用对象方法(需要传递对象: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

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值