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