python基础——基础代码每日复习002
面向对象:
#!/usr/bin/python # -*- coding: UTF-8 -*- class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print("Total Employee %d" % Employee.empCount) def displayEmployee(self): print("Name : ", self.name, ", Salary: ", self.salary) ey = Employee("小王",100.9) ey.displayCount() ey.displayEmployee() ey = Employee("小张",100.9222) ey.displayCount() ey.displayEmployee() print(Employee.empCount)
self 代表的是类的实例,代表当前对象的地址,而 self.__class__ 则指向类。
class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print(self) #self 代表的是类的实例,代表当前对象的地址,而 self.__class__ 则指向类。 print(self.__class__) def displayEmployee(self): print(self) #self 代表的是类的实例,代表当前对象的地址,而 self.__class__ 则指向类。 print(self.__class__) ey = Employee("小王",100.9) ey.displayCount() ey.displayEmployee() print("==================================================") ey = Employee("小张",100.9222) ey.displayCount() ey.displayEmployee()
添加,删除,修改类的属性
class Employee: '所有员工的基类' empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print("Total Employee %d" % Employee.empCount) def displayEmployee(self): print("Name : ", self.name, ", Salary: ", self.salary) "创建 Employee 类的第一个对象" emp1 = Employee("Zara", 2000) emp1.displayEmployee() print("---------------------------------------------------------------") "创建 Employee 类的第二个对象" emp2 = Employee("Manni", 5000) emp2.displayEmployee() print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") print("Total Employee %d" % Employee.empCount) print("===========================================================") emp1.age = 7 # 添加一个 'age' 属性 emp1.age = 8 # 修改 'age' 属性 print(emp1.age) del emp1.age # 删除 'age' 属性
类属性的分类和类方法的分类:
''' 1、类体中、所有函数之外:此范围定义的变量,称为类属性或类变量; 2、类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量; 3、类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。 ''' ''' 1、采用 @classmethod 修饰的方法为类方法; 2、采用 @staticmethod 修饰的方法为静态方法; 3、不用任何修改的方法为实例方法。——在类中定义的方法默认都是实例方法。不仅如此,类的构造方法理论上也属于实例方法,只不过它比较特殊。 实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类对象直接调用 ''' #Python类实例方法 class CLanguage: #类构造方法,也属于实例方法 def __init__(self): self.name = "C语言中文网" self.add = "http://c.biancheng.net" # 下面定义了一个say实例方法 def say(self): print("正在调用 say() 实例方法") clang1 = CLanguage() clang1.say() print("----------------------------------") #类名调用实例方法,需手动给 self 参数传值 clang2 = CLanguage() CLanguage.say(clang2) print("====================================================") #Python类方法 ''' #注意,如果没有 @classmethod,则 Python 解释器会将 fly() 方法认定为实例方法,而不是类方法。 #类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐) ''' class CLanguage: #类构造方法,也属于实例方法 def __init__(self): self.name = "C语言中文网" self.add = "http://c.biancheng.net" #下面定义了一个类方法 @classmethod def info(cls): print("正在调用类方法",cls) #使用类名直接调用类方法 CLanguage.info() print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++") #Python类静态方法 ''' 静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。 静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。 ''' class CLanguage: @staticmethod def info(name,add): print(name,add)
property()函数:定义属性
Python 中提供了 property() 函数,可以实现在不破坏类封装原则的前提下,让开发者依旧使用“类对象.属性”的方式操作类中的属性。
property() 函数的基本使用格式如下: 属性名=property(fget=None, fset=None, fdel=None, doc=None)
其中,fget 参数用于指定获取该属性值的类方法,fset 参数用于指定设置该属性值的方法,fdel 参数用于指定删除该属性值的方法,最后的 doc 是一个文档字符串,用于说明此函数的作用。
注意,在使用 property() 函数时,以上 4 个参数可以仅指定第 1 个、或者前 2 个、或者前 3 个,当前也可以全部指定。也就是说,property() 函数中参数的指定并不是完全随意的。
class CLanguage: #构造函数 def __init__(self,n): self.__name = n #设置 name 属性值的函数 def setname(self,n): self.__name = n #访问nema属性值的函数 def getname(self): return self.__name #删除name属性值的函数 def delname(self): self.__name="xxx" #为name 属性配置 property() 函数 name = property(getname, setname, delname, '指明出处') #调取说明文档的 2 种方式 #print(CLanguage.name.__doc__) help(CLanguage.name) clang = CLanguage("C语言中文网") #调用 getname() 方法 print(clang.name) #调用 setname() 方法 clang.name="Python教程" print(clang.name) #调用 delname() 方法 del clang.name print(clang.name)
class CLanguage: #构造函数 def __init__(self,n): self.__name = n #设置 name 属性值的函数 def setname(self,n): self.__name = n #访问nema属性值的函数 def getname(self): return self.__name #删除name属性值的函数 def delname(self): self.__name="xxx" #为name 属性配置 property() 函数 name = property(getname) help(CLanguage.name) clang = CLanguage("C语言中文网") #调用 getname() 方法 print(clang.name) print("=====================================") #调用 setname() 方法 clang.name="Python教程" print(clang.name) #调用 delname() 方法 del clang.name print(clang.name)
''' 装饰器接受一个函数作为参数,添加一些功能并返回它。 ''' ''' 饰器是一种函数,它接受一个函数作为参数,并返回一个新的函数或修改原来的函数。 装饰器的语法使用 @decorator_name 来应用在函数或方法上。 Python 还提供了一些内置的装饰器,比如 @staticmethod 和 @classmethod,用于定义静态方法和类方法。 装饰器的应用场景: 日志记录: 装饰器可用于记录函数的调用信息、参数和返回值。 性能分析: 可以使用装饰器来测量函数的执行时间。 权限控制: 装饰器可用于限制对某些函数的访问权限。 缓存: 装饰器可用于实现函数结果的缓存,以提高性能。 ''' import time # 定义一个装饰器函数来计算函数执行时间 def timer(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() print(f"函数{func.__name__}执行耗时:{end_time - start_time}秒") return result return wrapper # 使用装饰器 @timer # 等同于 example = timer(example) def example(): time.sleep(1) print("这是一个示例函数。") # 调用被装饰的函数 example()
参考::: https://www.cainiaojc.com/python/python-decorator.html
def smart_divide(func): def inner(a,b): print("我要做除法",a,"和",b) if b == 0: print("哎呀!不能除") return return func(a,b) return inner @smart_divide def divide(a,b): return a/b divide(9,3) print("===================") divide(9,0)
class Celsius: def __init__(self, temperature=0): self._temperature = temperature def to_fahrenheit(self): return (self.temperature * 1.8) + 32 @property def xx(self): print("获得值") return self._temperature @xx.setter def A(self, value): if value < -273: raise ValueError("零下273度是不可能的") print("设定值") self._temperature = value c = Celsius(20) print(c.xx) print("========================") c.A = -200 print(c.xx)
class Bird: #鸟有翅膀 def isWing(self): print("鸟有翅膀") #鸟会飞 def fly(self): print("鸟会飞") class Ostrich(Bird): # 重写Bird类的fly()方法 def fly(self): print("鸵鸟不会飞") # 创建Ostrich对象 ostrich = Ostrich() #调用 Ostrich 类中重写的 fly() 类方法 ostrich.fly()
''' 如何调用被重写的方法 ''' class Bird: #鸟有翅膀 def isWing(self): print("鸟有翅膀") #鸟会飞 def fly(self): print("鸟会飞") class Ostrich(Bird): # 重写Bird类的fly()方法 def fly(self): print("鸵鸟不会飞") # 创建Ostrich对象 ostrich = Ostrich() #调用 Bird 类中的 fly() 方法 Bird.fly(ostrich)
class people: # 定义基本属性 name = '' age = 0 # 定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 # 定义构造方法 def __init__(self, n, a, w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" % (self.name, self.age)) # 单继承示例 class student(people): grade = '' def __init__(self, n, a, w, g): # 调用父类的构函 people.__init__(self, n, a, w) self.grade = g # 覆写父类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade)) s = student('ken', 10, 60, 3) s.speak()