day15类和对象

1.对象方法、类方法、静态方法

1.对象方法:
a. 直接声明在类中
b. 自带参数self
c. 通过对象来调用

2.类方法:
a. 将函数声明在 @classmethod 后面。就是类方法
b. 自带参数cls。 调用不用传参,系统会自动将调用这个方法的类 赋给它
c. 类方法要通过类来调用

3.静态方法:
a. 声明在 @staticmethod 后面的函数就是静态方法
b. 没有自带的参数
c. 通过类来调用

4.怎么选择使用哪种方法(重点!):
对象方法:如果实现函数的功能需要用到对象的属性,那么就把这个函数声明成对象方法
静态方法和类方法:实现函数的功能不需要用到对象的属性,就可以选择使用静态方法或者类方法
类方法:在不使用对象属性的前提下,需要使用类,就用类方法
静态方法: 既不需要对象的属性,也不需要类 ,就用静态方法

class Person:
    # 声明一个类方法
    num =61
    @classmethod
    def destroy(cls):
        #cls 指向的是当前类,调用这个方法的类可以做的事情cls都可以做
        # .和对象方法中的self对应的对象一样
        print('cls:',cls,cls.num)
        p2 = cls()
        print('人类破坏环境')
    # 声明一个静态方法
    @staticmethod
    def func1():
        print(Person.num)
        p3 = Person()
        print(p3)
        print('人类的静态方法')

Person.destroy()
Person.func1()

2.私有化

类中的内容默认都是公开的(在类的外面可以使用)

  1. 私有化 -- >将类的内容在类的外面隐藏不能直接用。
    在类中方法名或者属性名前加两个下划线 __
    私有的方法和属性只能在类的内部使用,只能在类的外部使用

2.私有的原理
python中没有真正的私有化(没有从访问权限上去限制内容的访问)
私有的原理就是在私有的属性名或者方法名前加前缀'_类名 来阻止外部
通过带两个下划线的名字去使用属性和方法

class Person:
    def __init__(self,name,age):
        self.name = name
        #私有对象属性两个下划线
        self.__age = age
    def show_age(self):
        print(self.age)
        self.func2()
    #私有对象方法
    def __func2(self):
        print(self.age)
p1 = Person('xiaoming',23)
#print(p1.age)
#p1.func2()
p1.show_age()
p1._Person__age

3.getter和setter

1.什么时候需要添加对象属性的getter和setter
如果希望在通过 对象.属性 获取属性的值之前,在干点别的事情,就可以给这个属性添加getter
如果希望在通过 对象.属性 给属性赋值之前,在干点别的事,就可以给这个属性添加setter

2.怎么添加setter和getter
getter
a. 属性名前加一个下划线 属性名
b.添加属性对应的getter
@property
def 属性名去掉
(self):
函数体--> 会对属性的值进行处理后返回相应的结果,函数体必须要有返回值
c. 使用属性的值的时候不通过带下划线的属性名去使用,而是通过没有下划线的属性名取使用。

注意:对象.不带下划线的属性名,实际上就是在调用getter后声明的函数

a.添加setter
如果想要添加setter必须要先添加了getter
@getter.setter
def 属性名去掉_(self,参数): #除了默认值self必须再传一个参数
作别的事情
self.属性名 = 处理后的值

#年龄的值要在0-150之间,超出就报错,获取值的时候返回年龄值,并且返回这个年龄对应的阶段
class Person:
    # def __init__(self,name,age):
    #     self.name = name
    #     self._age = age

    def __init__(self):# 这里是不是要先确定属性的值。不能等传参。
        self.name =0  #
        self._age = 0
    @property
    def age(self):
        if 0 <= self._age<=17:
            return '未成年'
        elif 18<=self._age<= 30:
            return '青年'
        elif 31<=self._age <= 50:
            return '中年'
        elif 51 <= self._age<= 80:
            return '暮年'
        else:
            return '老年'

    @age.setter
    def age(self,a):
        if  not  0<= a <=150:
            raise ValueError
        self._age = a


p1 = Person()
p1.age=9
print(p1.age) #这里的p1.age是获取值,所以调用的是getter对应的age函数。

p1.age = 99 # 这个p1.age 是对age赋值,所以调用的是sttter对应的age函数。这里相当于给age函数的a传参99
print(p1.age)

你可能感兴趣的:(day15类和对象)