类的实例方法&静态方法&类方法&属性方法&属性

191 阅读4分钟

目录:

分类:

按照调用方式可以分为3种,实例方法、静态方法、和类方法

实例方法

实例方法只能通过实例对象调用,不能通过类进行调用。实例方法再定义时候使用关键字self,self代表实例对象本身。

class A():
    x=100
    def fun(self,y):
        self.x+=y
a=A()
a.fun(10)
print(a.x)
A.fun(10)

*****结果******
110
Traceback (most recent call last): #类调用错误
  File "/home/34f17b632da0cc986bc0f291c0518783.py", line 8, in <module>
    A.fun(10)
TypeError: fun() missing 1 required positional argument: 'y'

静态方法

静态方法可以使用实例对象调用,也可以使用类进行调用,他的的特点没有参数限制,定义时需要在函数前加@staticmethod

  1. 作用:静态方法可以更好的组织代码,防止代码变大后变得比较混乱。
  2. 特性: 静态方法只是名义上归类管理,实际上在静态方法里访问不了类或则实例中的任何属性
  3. 静态方法使用场景:
  • 我们要写一个只在类中运行而不在实例中运行的方法.
  • 经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法
  • 比如更改环境变量或者修改其他类的属性等能用到静态方法
  • 这种情况可以直接用函数解决, 但这样同样会扩散类内部的代码,造成维护困难
  1. 调用方式: 既可以被类直接调用,也可以通过实例调用

@staticmethod静态方法

class Dog(object):
    def __init__(self,name):
        self.name = name
    @staticmethod
    def eat():
        print("I am a static method")
d = Dog("ChenRonghua")
d.eat()                       #方法1:使用实例调用
Dog.eat()                   #方法2:使用类直接调用

类方法

可以被类调用,也可以被实例对象调用,实例调用可以给类增加属性,类的属性修改需要通过类进行修改,类方法需要使用关键字cls,定义时候需要在函数前加@classmethod

  1. 作用:无需实例化直接被类调用
  2. 特性: 类方法只能访问类变量,不能访问实例变量
  3. 类方法使用场景: 当我们还未创建实例,但是需要调用类中的方法
  4. 调用方式: 既可以被类直接调用,也可以通过实例调

@classmethod类方法

class Dog(object):
    name = '类变量' #在这里如果不定义类变量仅定义实例变量依然报错
    def __init__(self,name):
        self.name = '实例变量'
        self.name = name
    @classmethod
    def eat(self,food):
        print("%s is eating %s"%(self.name,food))
Dog.eat('baozi')                   #方法1:使用类直接调用
d = Dog("ChenRonghua")          
d.eat("包子")                      #方法2:使用实例d调用

属性方法

属性方法的作用:

作用:属性方法把一个方法变成一个属性,隐藏了实现细节,调用时不必加括号直接d.eat即可调用self.eat()方法

@property属性方法

class Dog(object):
    def __init__(self, name):
        self.name = name

    @property
    def eat(self):
        print(" %s is eating" % self.name)
d = Dog("旺旺")
d.eat()
# 调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, 
# 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了

属性

1.类的公有属性
public_attrs:能在类的外部被使用或直接访问。在类内部的方法中使用时 public_attrs_attrs,在类的外部class_name.public_attrs。

2.类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

3.类的(公有)方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

公有属性,普通属性,私有属性 比较

1. 公有属性:在内存中仅存一份

2. 普通属性:每个实例对象在内存存一份

3. 私有属性:实例在外部无法调用

4.类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。

  • 默认情况下,程序可以从外部访问一个对象的特性
  • 为了让方法和特性变成私有(从外部无法访问),只要在它的名字前加上双下划线即可
  • 先在__inaccessible从外界是无法访问的,而在内部还能使用(比如从accessible访问)

类中函数私有化

class Secretive:
    def __accessible(self):
        print("you can't see me,unless you're calling internally")
    def accessible(self):
        print("The secret message is:")
        self.__accessible()
s = Secretive()
s.accessible()

# 运行结果:
# The secret message is:
# you can't see me,unless you're calling internally