python全栈开发 * 22 知识点汇总 * 180703

22  面向对象  ---       属性,类方法,静态方法,反射一.属性1.属性的定义:将方法伪装成属性,虽然在代码层面上没有任何高深之处,但让其看起来更合理.   (类似于属性的方法)class Person:    def __init__(self,name,weight,height):        self.name=name        self.weight=weight        self.height=height    @property    def bmi(self):        return self.weight/self.height**2p1=Person("吉喆嚞",56,1.65)# print(p1.bmi())                #  20.569329660238754   (不加@property)print(p1.bmi)                    #  20.569329660238754    (加@property)2.由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除class Goods:    def __init__(self,original_price,discount):        self.original_price=original_price        self.discount=discount    @property                               #获取    def price(self):        return self.original_price*self.discount    @price.setter                           #修改    def price(self,new_price):         self.original_price=new_price    @price.deleter                          #删除    def price(self):        del self.discount

g1=Goods(5,0.80)                      # 实例化一个对象print(g1.price())                     # 不加@property的用法   4.0print(g1.price)                       # 自动执行@property下的函数    4.0g1.original_price=10                  # 自动执行@price.setter下面的函数   将原价改为10print(g1.price)                       # 8del g1.discount                       # 自动执行@price.deleter下面的函数print(g1.discount)                    # ‘Goods‘ object has no attribute ‘discount‘

二.方法 方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同 1.普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self; 2.类方法 : 由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;对象如果调用类方法,也是自动 将类空间传给cls,不是把对象空间传给cls. @classmethod def class_func(cls):           定义类方法,至少有一个cls参数  类名.class_func()    调用类方法 class A:    __name = ‘alex‘    def func(self):        print(self,‘in  func‘)

@classmethod   # 类方法    def func1(cls):        print(cls, ‘in func1‘)a1=A()a1.func()             #<__main__.A object at 0x0000011792F389E8> in  funcA.func(a1)            #<__main__.A object at 0x0000011792F389E8> in  funcA.func1()             #<class ‘__main__.A‘> in func1     自动给cls传类空间a1.func1()            #<class ‘__main__.A‘> in func1     对象调用也是自动传类空间# 什么情况下使用类方法?# 直接让类去操作类中的方法,没有必要创建对象在操作的时候,用类方法. 3.静态方法: 由类调用;无默认参数   在类中定义一个静态方法,无需传入你的类空间,对象空间,可以当成普通函数去用. @staticmethod def static_func():  类名.static_func() class A:    __name = ‘alex‘    def func(self):        print(self,‘in  func‘)

@classmethod   # 类方法    def func1(cls):        print(cls, ‘in func1‘)    @staticmethod    def login(username,password):        print("登陆成功")A.login("alex","123")相同点 : 对于所有的方法而言,均属于类(非对象)中,所以在内存中也只保存一份。不同点 :方法调用者不同、调用方法时自动传入的参数不同三.反射1.反射的定义  通过字符串操作对象相关属性;python中的一切事物都是对象(都可以使用反射)2.反射一共有四种  (四个可以实现自省的函数)getattr     获取这个属性对应的值hasattr     判断此对象中有没有这个属性setattr     设置属性delattr     对一个对象属性进行删除3.用法:(1).实例化一个对象class A:    country = ‘China‘    def __init__(self, name, age):        self.name = name        self.age = agea1 = A(‘alex‘, 1000)print(getattr(a1,"country"))     #  Chinaprint(getattr(a1,"name"))        #  alexprint(hasattr(a1,"age"))         #  Truesetattr(a1,"sex","男")print(getattr(a1,"sex"))         #  男delattr(a1,"name")print(getattr(a1,"name"))        #  ‘A‘ object has no attribute ‘name‘if hasattr(a1,"name1"):    print(getattr(a1,‘name1‘))else:    print("没有...")             #  没有

(2). 对类的示例class A:    country = ‘China‘    job = ‘student‘

def __init__(self, name, age):        self.name = name        self.age = age    def func(self):        print(‘in func‘)content=input("<<<")                 #  输入的是 字符串if hasattr(A,content):               #  相当于  if hasattr(A,"字符串")print(getattr(A,content))print(getattr(A,"func"))             #  <function A.func at 0x00000145E4F99AE8>print(getattr(A,"func")(11))         #  in func   None  (默认返回None)print(getattr(A,"job"))              #  studentprint(getattr(A,"job1","False"))     #  Falseprint(getattr(A,"job1"))             #  报错    type object ‘A‘ has no attribute ‘job1‘

(3).对其他模块的示例import old_boyobject=getattr(old_boy,"B")print(getattr(object,"add")(3,4))          #  第一种方式  获取old_boy文件中的静态方法addprint(getattr(old_boy.B,‘add‘)(3,4))       #  第二种方式print(getattr(old_boy,‘login‘)("alex","123"))        #   调用old_boy 文件中的login函数

(4).对当前模块的示例import sysdef login():    print(55)

def func3():    print(333)content=input("<<<")getattr(sys.modules[__name__],content)()       #   55getattr(sys.modules[__name__],"func3")()      #   333

原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9260743.html

时间: 2024-10-09 12:42:13

python全栈开发 * 22 知识点汇总 * 180703的相关文章

python全栈开发 * 10知识点汇总 * 180612

10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表?接收任意内容) (1)动态位置参数def eat(*args): print(args)eat("水果","蔬菜","肉",)# # 结果以元祖的形式呈现. : ('水果', '蔬菜', '肉') (2) 位置参数,动态位置参数: 动态参数必须在位置参数后?def eat(a,b,*args): print(a,b,args)e

python全栈开发* 02 知识点汇总 * 180531

运算符和编码 一  格式化输出 1  .输入  name ,age , job , hobby. 输出  :   ---------------  info of Mary  ------------------ Name  : Mary Age   : 18 Job  : Teacher Hobbie  :sing ----------------------end------------------------- eg:   name = input ("Name  : ") ag

python全栈开发 * 26知识点汇总 * 180709

26 logging collections random 模块 一.logging低配:日志不能写入文件与显示同时进行 1.只写入文件:import logginglogger=logging.getLogger() #创建一个对象fn=logging.FileHandler("高配.log",encoding="utf-8",mode="w")logger.addHandler(fn)logging.debug("debug mes

python全栈开发 * 30知识点汇总 * 180713

30 re模块2一.正则表达式在线测试 在线测试工具 http://tool.chinaz.com/regex/(一).*?的用法: . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式.合在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:.*?x就是取前面任意长度的字符,直到一个x出现(二).问号"?"的四种用法 1.量词,重复零次或一次 2.非贪婪匹配(惰性匹配)的象征( .*? ) 3.?: 分组一开始加?:表示取消分组优先. 4.?p: 分组命名 html

Python全栈开发【基础三】

Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 6 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数体提供数据 返回值:当函数执行完毕后,可以给调用者返回数据. 总结使用函数的好处: 1.减少代码重用 2.保持一致性,易维护

Python全栈开发

Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大,但是理解起来有些困难,因此我尽量用最简单的例子一步步的说明这个原理. 1.不带参数的装饰器 假设我定义了一个函数f,想要在不改变原来函数定义的情况下,在函数运行前打印出start,函数运行后打印出end,要实现这样一个功能该怎么实现?看下面如何用

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

Python全栈开发【基础四】

Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 匿名函数 lambda表达式:对于简单的函数,存在一种简便的表示方式,即lambda表达式 1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10)) 匿名函数主要是和其它函数搭配使用 举例: 1 ########

Python全栈开发记录_第一篇

Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(代码行数:70行) 知识点1:优先级:not>and 短路原则:and:如果第一个条件的结论为假,那么 and 前后两个条件组成的表达式计算结果一定为假,后面的条件计算机不会进行计算 or:如果第一个条件的结论为真,那么or 前后两个条件组成的表达式计算结果一定为真,后面的条件计算机不会进行计算 知识点2:python区分大小写,常量需全部字母大写(默认这样写) python换行