day16-面向对象编程进阶

1.静态方法

通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名或者实例名来调用这个方法

import os

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

    @staticmethod
    '''
    实际上跟类没什么关系了,就是一个单纯的函数了,
    唯一的关系是需要类名或者实例名来调用
    ''''
    def eat(x):  # 此时不需要传入位置参数self参数了
        print("%s is eating %s" %(self.name,x))

    def talk(self):
        print("%s is talking"% self.name)
        
d = Apple("张三")
d.eat(d) # 传入d对象
# 张三 is eating apple

d.talk()
# 张三 is talking

 

2.类方法

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是,classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。本身可以用类和对象来调用。

class A(object):
    bar = 1
    def func1(self):
        print('foo')

    @classmethod
    def func2(cls):
        print('func2') # func2
        print(cls.bar) # 1
        cls().func1() # 调用foo方法 foo


a = A()
a.func2()

 

3.属性方法

@property的作用是在新式类中返回属性值。

class Person:
    def __init__(self, name):
        self.name = name

    @property #getter方法

    def name(self):
        return self._name

    @name.setter  #在setter方法中可以约束属性,非str将捕获一个type错误
    def name(self,name):
         if not isinstance(name, str):
            raise TypeError("Expected a string")
         self._name = name


p = Person('tom')
print(p.name)  # 当成属性访问
# tom


p1 = Person(123)
# typeerror:Expected a string
posted @ 2019-03-18 18:55  炫风真是风  阅读(152)  评论(0编辑  收藏  举报