Python之面向对象进阶知识

1. 反射

  a. python面向对象中的反射:对象用字符串形式操作去实现对象的相关属性,把一个字符串数据类型的变量变成一个真实存在在程序中的变量名,并且能够使用它。

  b. 四个函数

    *. getattr(对象,字符串类型的方法或属性):方法得到的是方法的地址,属性拿到的是值。等价于对象/类.属性/方法。getattr是反射中最常用的方法。

    *. hasattr:查看对象是否有某种属性或方法

    *. setattr:给对象设置属性或方法

    *. delattr:删除对象的属性或方法

class Person:
    def __init__(self,name):
        self.name = name
    def happy(self):
        print("%s is happy"%self.name)

pe = Person("pe")
func = getattr(pe,"happy")
# 相当于jh.happy()
func()

# hasattr(对象,要去调用的属性或方法)--判断是否有这个属性
if hasattr(pe,"sleep"):
    func = getattr(pe,"sleep")
    func()

# 不常用--setattr() 设置属性
setattr(pe,"sex","female")  # 添加属性
print(pe.sex)

def sleep(self):    # 添加方法,必须要传一个参数,非常不常用,一般不用
    print("%s is sleep"%self.name)
setattr(pe,"sleep",sleep)
pe.sleep(pe)

# delatter--删一个属性  delattr(对象,属性名)
delattr(pe,"sleep")     #删除属性
print(pe.sleep)     # 报错

 

2. 类的内置方法

  a. __str__和__repr__

    *. %s 和 __str__ 一样,%r 和 __repr__ 一样

    *. __repr__是__str__的备胎,可以替代__str__,但__str__不能替代__repr__,在只能实现一个方法是优先实现__repr__

  b. __del__ 析构方法:在程序执行完成后,自动执行。主动触发,立马执行,和del一样

  c. __call__:对象()--自动触发

  d. __eq__:== 自动触发

  e. __hash__:hash 自动触发

  f. item:都是用 对象[] 去触发

    *. __getitem__:调用属性或方法

    *. __setitem__:创建属性或方法

    *. __delitem__:删除属性或方法

  g. __new__:创造对象self,在类里边默认先执行__new__方法

class A:
  def __new__(cls, *args, **kwargs):
    pass
  def __init__(self):
    pass

3. 单例模式:实例始终只有一个,它的属性随设置而改变
class Teacher:
    __isinatance = None
    def __new__(cls, *args, **kwargs):
        if not cls.__isinatance:
            cls.__isinatance = object.__new__(cls)
        return cls.__isinatance

    def __init__(self,name,cloth):
        self.name = name
        self.cloth = cloth

liu = Teacher("liu","1")
liu2 = Teacher("liu","2")
liu3 = Teacher("liu","3")
print(liu)
print(liu2)
print(liu3)

 















 

posted @ 2020-01-20 11:00  chitalu  阅读(157)  评论(0编辑  收藏  举报