property属性

什么是特性property

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

 

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

    # 相当于java中get()
    @property
    def name(self):
        return self.__name + "goodman"

    # 相当于java中set()
    @name.setter
    def name(self, new_name):
        self.__name = new_name


tiger = Person("湖哥")
print(tiger.name)
tiger.name = "小哥"
print(tiger.name)

一个静态属性property本质就是实现了get,set,delete三种方法

# property
# 内置装饰器函数 只在面向对象中使用
class Person:
    def __init__(self, name):
        self.__name = name
        self.price = 20

    @property
    def name(self):
        return self.__name

    @name.deleter
    def name(self):
        del self.__name

    @name.setter
    def name(self, new_name):
        self.__name = new_name


brother = Person("二哥")
# del Person.price
brother.name = "newName"
print(brother.name)
del brother.name
# print(brother.name)

为什么要用property

将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

 

classmethod

class Goods:
    __discount = 0.8

    def __init__(self, name, price):
        self.name = name
        self.__price = price

    @property
    def price(self):
        return self.__price * Goods.__discount

    # classmethod类方法
    @classmethod  # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象
    def change_discount(cls, new_discount):
        # 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法
        cls.__discount = new_discount


apple = Goods("苹果", 5)
print(apple.price)
Goods.change_discount(0.5)
print(apple.price)

 

staticmethod

class Login:
    def __init__(self, name, password):
        self.name = name
        self.pwd = password
        # print(name, password)

    def login(self):
        pass

    @staticmethod
    def get_usr_pwd():
        usr = input("用户名:")
        pwd = input("密码:")
        # 创建Login对象,调用__init__()方法
        Login(usr, pwd)


Login.get_usr_pwd()

# 在完全面向对象的程序中,
# 如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法


# 类方法和静态方法 都是类调用的
# 对象可以调用类方法和静态方法么?   可以   一般情况下 推荐用类名调用
# 类方法 有一个默认参数 cls 代表这个类  cls
# 静态方法 没有默认的参数 就象函数一样

反射

1 什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

 

2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

class Foo:
    f = '类的静态变量'
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say_hi(self):
        print('hi,%s'%self.name)

obj=Foo('egon',73)

#检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))

#获取属性
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')
func()

print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

#设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))

#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错

print(obj.__dict__)