@property @classmethod @staticmethod python3

在Python中,默认情况下,创建的类属性或者实例是可以在类外进行修改的,如果想要限制其不能在类体外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能获取他的值。如果想要创建一个可以读但不能修改的属性,那么也可以使用@property实现只读属性
class Person():
    def __init__(self,name,age):
        self.__age=age;#__两个下划线开头为私有变量
        self.__name=name;
    def __
p=Person('nk',12);
print(p.__age) ;
AttributeError: 'Person' object has no attribute '__age'   
###################################
p=Person('nk',12);
p.__age=16
print(p.__age,p.get_age())  
p.__age是专属p对象的临时属性,和class内部的属性不同
16 12 

在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。

class Person():
    def __init__(self,name,age):
        self.__age=age;
        self.__name=name;
    @property
    def get_age(self):
        return self.__age;
    #get_age是方法名,这样写就可以赋值了,不然__age只读
    @get_age.setter
    def set_age(self,age):
        self.__age=age;
p=Person('nk',12);
print(p.get_age)
p.set_age=13;
print(p.get_age)

12 13

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢
从它们的使用上来看,
  1. @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
  2. @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
  3. @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。
类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。 普通对象方法至少需要一个self参数,代表类对象实例类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。对于类方法,可以通过类来调用,就像Test.foo(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像Test().foo(),这里Test(),写成这样之后它就是类的一个实例了。
静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。而@classmethod因为持有cls参数(当然,也可以用“self” 代替,个人认为是为了和类的self区分才用cls的),可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
class Person(object):
	全局变量;
	只有类来调用才能更改,全局更改,如 Person.class_name='Nike',
	像self.clas_name='MIku',只对当前实例self有效
    class_name='PersonTest';
    def __init__(self,val):
        self.val=val;
    参数为self的,为实例方法 ,实例函数
    self为 <__main__.Person object at 0x00000280B893FC50>
    def printNow(self):
        print('---> ',self.val);
    以下最好用类名来调用,是类函数
    不需要self或cls,可以加参数,不如name,age。。。。。,
    @staticmethod
    def printStatic():
        print('----> ',Person.class_name);
    cls代表类方法,这里可以改为self,但和cls一样为类,
    cls为 <class '__main__.Person'>
    @classmethod 
    def printClass(cls):
        print('---> ',cls.class_name);
person=Person('Milly'); person为一个对象
person.printNow();
Person.printStatic();
Person.printClass();  
#person.printStatic(); 可以写
#person.printClass();  可以写 但也只是访问类方法
--->  Milly
---->  PersonTest
--->  PersonTest
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值