python-day26_类的内置装饰器函数

1,封装

# class Room:
#    def __init__(self,name,length,width):
#      self.__name = name
#      self.__length = length
#      self.__width = width
#    def get_name(self):
#      return self.__name
#    def set_name(self,newName):
#      if type(newName) is str and newName.isdigit() == False:
#        self.__name = newName
#      else:
#        print('不合法的姓名')
#      def area(self):
#        return self.__length * self.__width
#
# jin = Room('金老板',2,1)
# print(jin.area())
# jin.set_name('2')
# print(jin.get_name())

# 假设父类的私有属性 能被 子类调用么
# class Foo:
#    __key = '123'   # _Foo__key
#
# class Son(Foo):
#    print(Foo.__key)   # _Son__key


# 会用到私有的这个概念de场景
#1.隐藏起一个属性 不想让类的外部调用
#2.我想保护这个属性,不想让属性随意被改变
#3.我想保护这个属性,不被子类继承

 

2,property

# property
# 内置装饰器函数 只在面向对象中使用
from math import pi
class Circle:
    def __init__(self,r):
        self.r = r
    @property
    def perimeter(self):
        return 2*pi*self.r
    @property
    def area(self):
        return self.r**2*pi

# c1 = Circle(5)
# print(c1.area)     # 圆的面积
# print(c1.perimeter) # 圆的周长

# class Person:
#     def __init__(self,name,high,weight):
#         self.name = name
#         self.high = high
#         self.weight = weight
#     @property
#     def bmi(self):
#         return self.weight / self.high**2

# jin = Person('金老板',1.6,90)
# jin.bmi = 18
# classmethod
# staticmethod

# class Person:
#     def __init__(self,name):
#         self.__name = name
#     @property
#     def name(self):
#         return self.__name + 'sb'
#     @name.setter
#     def name(self,new_name):
#         self.__name = new_name
#
# tiger = Person('泰哥')
# print(tiger.name)
# tiger.name = '全班'
# print(tiger.name)

name.setter修饰的函数在进行传参时,只能传一个参数

程序中的del,只是触发了类中的name.deleter修饰的方法

 

3,

# method 方法
# staticmathod 静态的方法 ***
# 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    # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象
#    def change_discount(cls,new_discount):    # 修改折扣
#      cls.__discount = new_discount
# apple = Goods('苹果',5)
# print(apple.price)
# Goods.change_discount(0.5) # Goods.change_discount(Goods)
# print(apple.price)
# 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法

# java
class Login:
  def __init__(self,name,password):
    self.name = name
    self.pwd = password
  def login(self):pass

  @staticmethod
  def get_usr_pwd(): # 静态方法
    usr = input('用户名 :')
    pwd = input('密码 :')
    Login(usr,pwd)

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

 

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

 

4,

#反射 *****
# name = 'alex'
# 'name'

class Teacher:
  dic = {'查看学生信息':'show_student','查看讲师信息':'show_teacher'}
  def show_student(self):
    print('show_student')

  def show_teacher(self):
    print('show_teacher')

  @classmethod
  def func(cls):
    print('hahaha')
alex = Teacher()
for k in Teacher.dic:
  print(k)
key = input('输入需求 :')
# print(Teacher.dic[key])
if hasattr(alex,Teacher.dic[key]):
  func = getattr(alex,Teacher.dic[key])
  func()
# # alex.show_student() 'show_student'
# func = getattr(alex,'show_student')
# func()

# hasattr getattr delattr 三种反射方法
# if hasattr(Teacher,'dic'):  #hasattr用于判断,'dic'属性是否存在
#    ret = getattr(Teacher,'dic')    # Teacher.dic # 类也是对象
# # ret2 = getattr(Teacher,'func')    # 类.方法 teacher.func
# # ret2()
# print(ret)


# menu = Teacher.dic
# for k in menu:
#    print(k)

# 通过反射
# 对象名 获取对象属性 和 普通方法
# 类名 获取静态属性 和类方法 和 静态方法

# 普通方法 self
# 静态方法 @staticmethod
# 类方法 @classmethod
# 属性方法 @property

 

posted @ 2019-02-08 08:47  烟云过眼  阅读(98)  评论(0编辑  收藏  举报