面向对象和类(七)

递归 —— 绘制分形几何

外部无法调用内部(隐藏)函数

def outer():
    print("outer")
    
    def inner():
        print("inner")
    
    inner()

outer()
# 写法1
def Chinese(name, family_name):
    print({0}{1}.format(family_name,name))

def English(name, family_name):
    print({0}{1}.format(name,family_name))

# 写法2
def Printname(isChinese, name, family_name):
    def inner(name, family_name):
        print({0}{1}.format(name,family_name))
    if isChinese:
        inner(family_name, name)
    else:
        inner(name, family_name)

nonlocal  关键字

a = 100

def outer():
    b = 10

    def inner():
        nonlocal b           # 声明外部函数的局部变量,这样改b不会报错
        print('inner b:', b)
        b = 20
        
        global a             # 声明全局变量
        a = 1000              
    
    inner()
    print('outer b:', b)
    print('a:', a)

outer()

>>> inner b: 10
>>> outer b: 20
>>> a: 1000

 面向对象编程

面向过程:按计划完成,找动词

面向对象:造车,找名词

简单数字 → 数组 → 结构体 → 对象

__new__ 创造对象

__init__ 初始化对象,第一个参数固定,也就是给创造的对象赋值

函数 第一个参数固定

__del__ 析构方法,垃圾回收机制

__call__ 可调用对象,__call__()的作用是使实例能够像函数一样被调用,假设x是X类的一个实例。那么调用x.__call__(1,2)等同于调用x(1,2) ,这个实例本身在这里相当于一个函数 ;

Student(类)是一个模具,定义了一个类将地址(图中为123)赋给了a,直接调用的是模具中的函数(say_score),处理的对象是地址引用的对象

print(dir(a))               # 对象的属性、方法

print(a.__dict__)           # 对象的属性字典

class Man:
    pass                    # 没想好定义什么类

print(isinstance(a, Man))   # 是否对象是否是该类型的实例对象

如果有s1,s2,s3,则会创建3个Student对象

类属性需要用对象调用,实例对象存储的是实例属性,调用的say_score函数位于类型对象里(模具),存储了类属性和代码信息,好处是当创造了100个对象,可以不用创建100个方法,say_score指向了新对象,此处未展开

类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象

创建类方法

类方法是从属于“类对象”的方法,通过装饰器@classmethod来定义

class Student:
    company = 'SXT'

    @classmethod
    def printcompany(cls):
        print(cls.company)

Student.printcompany()

创建新对象不能引用printcompy()函数,没有代码信息

调用类方法或静态方法时不能调用实例对象和实例方法,不能调用self(也就是第4点)

创建静态方法

Python中允许定义与“对象”关的方法,称为“静态方法”

“静态方法”和在模块中定义普通函数没有区别,只不过“静态方法”放到了"类的名字空间里面“ ,需要通过”类调用"

class Student:
    company = 'SXT'

    @staticmethod
    def add(a,b):
        print(a+b)

Student.add(20,30)

__del__机制

class Person:
    def __del__(self):
        print('销毁对象{0}'.format(self))

p1 = Person()
p2 = Person()

del p2

__call__机制

class salaryacc():
    def __call__(self, salary):
        return dict(monthSalary = salary)

s = salaryacc()
print(s(3000))
# 相当于 salaryacc()(3000)

people = People("nlj", 28)   # init
people("xxxx", 30)           # call
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值