类装饰器
propety
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
class Student:
def __init__(self,name,birth):
self.name = name
self.birth = birth
@property # 将一个方法伪装成属性
def age(self):
import time
return time.localtime().tm_year - self.birth
alex = Student('alex',1930)
print(alex.age) # 名词
为什么要用property
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式 遵循了统一访问的原则
除此之外,看下
ps:面向对象的封装有三种方式:
【public】
这种其实就是不封装,是对外公开的
【protected】
这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开
【private】
这种封装对谁都不公开
class Circle:
def __init__(self,r):
self.r = r
@property
def area(self): # 面积更像是圆的属性
return 3.14*self.r**2
@property
def perimeter(self): # 周长更像是圆的属性
return 2*3.14*self.r
c = Circle(10)
print(c.area)
print(c.perimeter)
staticmethod
class Staticmethod_Demo():
role = 'dog'
@staticmethod
def func():
print("当普通方法用")
Staticmethod_Demo.func()
class Student:
def __init__(self,name):
self.name = name
@staticmethod # 声明login方法是一个静态方法 ,不必传任何默认的参数
def login(flag):
print('登录程序',flag)
username = input('>>>')
stu = Student(username)
return stu
# 要想调用login 必须现有对象
# 要想创建对象 必须用户先输入名字
# 得调用登录之后才开始input
# 不必实例化就可以调用的login方法 不需要传递对象作为参数,就定义这个方法为静态方法
obj = Student.login(flag = True) # 用类名可以直接调用这个方法了
print(obj.__dict__)
classmethod
class Manager:
def __init__(self,name):
self.name = name
@classmethod # 装饰当前这个方法为一个类方法,默认传参数cls,表示当前所在的类名
def login(cls):
username = input('>>>')
stu = cls(username)
return stu
obj = Manager.login() # 用类名可以直接调用这个方法了
print(obj.__dict__)