python学习之路

Python--面向对象

2019-05-25  本文已影响25人  Alcazar

面向对象(Object Oriented)

是软件开发方法。

面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。

定义:类(Class)是面向对象程序设计(Object-Oriented Programming)实现信息封装的基础。类是一种用户定义类型。

属性:表示类的特点,
(方法):规定这个类的功能.

程序 = 数据结构 + 算法
类 = 属性 + 方法(行为)

两者的区别:

####### __ new__()方法:
__new__()方法是在类准备将自身实例化时调用。
__new__()方法始终都是类的静态方法,即使没有被加上静态方法装饰器。
__new__()方法负责开发地皮,打下地基,并将原料存放在工地。

举个栗子:

class Cat:

    def __new__(cls, *args, **kwargs):
        print('__new__')
        return super().__new__(cls)
    # 构造方法,该方法会在创建对象(实例)的时候,自动调用
    def __init__(self,color,name):
        self.color = color
        self.name = name

    def catch_rat(self):
        print(self.name + '抓住了老鼠jake')

# # 创建实例
tom = Cat('Blue','Tom')
tom.catch_rat()
# 实例化对象的过程
# 1.分配内存
# 2.分配内存(__new__)
# 3.初始化值(__init__)
print(tom.name)
tom.name = 'jiafei'
print(tom.name)

演绎实例化对象的过程

输出:

__new__
Tom抓住了老鼠jake
Tom
jiafei
{'color': 'Blue', 'name': 'jiafei'}
属性私有化(别人不能改)

来看看以下实例:

class Student:
    '''
    学生类
    '''
    def __init__(self,name,age):
        self.__name = name;
        self.__age = age

    def set_name(self,name):
        if not len(name) < 3:
            self.__name = name

    def get_name(self):
        return self.__name

    def age(self):
        return self.__name

    @property
    # 把get方法变为属性只需要加上 @property装饰器即可
    def age(self):
        print('年龄:')
        return self.__age

    @age.setter
    # @property本身又会创建另外一个装饰器 @score.setter
    # @score.setter负责把set方法变成给属性赋值
    def age(self,age):
        if age >0 and age <100:
            self.__age = age


s = Student('Zurich',36)
# 提供了get\set 方法
print(s.get_name())
s.set_name('Alcazar')
print(s.get_name())

s.age = 27
print(s.age)

内存分析结果示例:


内存分析

执行结果:

Zurich
Alcazar
年龄:
27
代码块中涉及的 @property@score.setter

@property


一般来说,要使用某个类的方法,需要先实例化一个对象,然后调用方法。
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

如何区分 @classmethod 和@staticmethod

@classmethod 修饰的方法是类方法,类方法可以通过类名调用.
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数

@staticmethod 修饰的方法:静态方法.可以通过类名直接访问.可当做普通函数.
可以用来写工具类
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样

更多关于@staticmethod和@classmethod的更多知识点

class User:
    num = 0
    def __init__(self,name):
        self.name = name
        User.num +=1

    def print_name(self):
        print(self.name,User.num)

    @classmethod
    def create_user(cls,name,age):
        # user = cls(name)
        # user.name = name
        print(cls)
        user = cls(name)
        user.age = age
        return user

    @staticmethod
    def sum(a,b):
        return a+b

    def __str__(self):
        _str = ''
        for k,v in self.__dict__.items():
            _str += str(k)
            _str += ':'
            _str += str(v)
            _str += ','
        return _str

u1 = User('Zurich')
u1.print_name()

u2 = User('Alcazar')
u2.print_name()

User.num += 1
u1.print_name()

u3 = User.create_user('Zurich',18)
print(u3.age)
print(u3.name)
#@classmethod 修饰的方法是类方法,类方法可以通过类名调用.
# 类方法必须有一个类型参数:cls

print(User.sum(3,5))
# @staticmethod 修饰的方法:静态方法.可以通过类名直接访问.可当做普通函数.
# 可以用来写工具类

u4 = u1.create_user('Zurich',21)
print(u4.age)
print(u4.sum(6,6))
print(u4)
print(u2)

输出:

Zurich 1
Alcazar 2
Zurich 3
<class '__main__.User'>
18
Zurich
8
<class '__main__.User'>
21
12
name:Zurich,age:21,
name:Alcazar,
上一篇下一篇

猜你喜欢

热点阅读