面向对象学不会看不懂?一文详解面向对象知识点总结

面向对象软件工程知识点 面向对象软件工程知识点  1.封装是指把对象的(A)结合在一起,组成一个独立的对象。 A.属性和操作 B.信息流 C.消息和事件 D.数据的集合 2.状态图和活动图建立了UML面向对象开发过程中的对象动态(B)模型。 A.交互      B.状态       C.体系结构     D.软件复用 3.UML的(C)模型图由活动图、顺序图、状态图和合作图组成。 A.用例 B.静态 阅读详情

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取

Python免费学习资料、代码以及交流解答点击即可加入


一、类与对象

1.1、类的结构

class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段
    dic = {}
    l1 = []

    def work(self):  # 第二部分:方法 函数 动态属性
        print('人类会工作')

1.2、从类名的角度研究类

1.2.1、类名操作静态属性

1)查看类中的所有内容:类名__dict __方式

class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想'
    dic = {}
    l1 = []

    def work(self):
        # print(self)
        print('人类会工作')


print(Human.__dict__)   
# {'__module__': '__main__', '__doc__': '\n    此类主要是构建人类\n    ', 'mind': '有思想', 'dic': {}, 'l1': [], 'work': <function Human.work at 0x0000017D90897438>, '__dict__': <attribute '__dict__' of 'Human' objects>, '__weakref__': <attribute '__weakref__' of 'Human' objects>}

print(Human.__dict__['mind'])   # 有思想
# Human.__dict__['mind'] = '无脑'   # TypeError: 'mappingproxy' object does not support item assignment
# 通过这种方式只能查询,不能增删改.

2)通过万能的点.

# 通过万能的点 可以增删改查类中的单个属性
class Human:
    """
    此类主要是构建人类
    """
    mind = '有思想'
    dic = {}
    l1 = []

    def work(self):
        # print(self)
        print('人类会工作')


print(Human.mind)  # 查
Human.mind = '无脑'  # 改
print(Human.mind)
del Human.mind  # 删
Human.walk = '直立行走'
print(Human.walk)

总结:如果想查询类中的所有内容,通过 第一种__ dict__方法,如果只是操作单个属性则用万能的点的方式。

1.2.2、类名操作动态方法

前提:除了两个特殊方法:静态方法,类方法之外,一般不会通过类名操作一个类中的方法

class Human:
    mind = '有思想'
    dic = {}
    l1 = []

    def work(self):
        print(self)
        print('人类会工作')

    def tools(self):
        print('人类会使用工具')


Human.work(111)
Human.tools(111)
# 下面可以做,但不用
Human.__dict__['work'](111)

1.3、从对象角度研究类

1.3.1、什么是对象

对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象

class Human:
    mind = '有思想'

    def __init__(self):
        print(666)
        print(self)  # <__main__.Human object at 0x00000191508AA828>

    def work(self):
        print('人类会工作')

    def tools(self):
        print('人类会使用工具')


obj = Human()  # 只要实例化对象,它会自动执行__init__方法
print(obj)  # <__main__.Human object at 0x00000191508AA828>
# 并且obj的地址与self的地址相同

对象实例化三件事:

  • 1)在内存中开辟了一个对象空间
  • 2)自动执行类中的init方法,并将这个对象空间(内存地址)传给了init方法的第一个位置参数self
  • 3)在init方法中通过self给对象空间添加属性
class Human:
    mind = '有思想'
    language = '使用语言'

    def __init__(self, name, sex, age, hobby):
        # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby


obj = Human('barry', '男', 18, '运动')

1.3.2、对象操作对象空间属性

1)对象查询对象中所有属性:对象.__ dict__

class Human:
    mind = '有思想'
    language = '实用语言'

    def __init__(self, name, sex, age, hobby):
        # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby


obj = Human('barry', '男', 18, '运动')
print(obj.__dict__)  # {'n': 'barry', 'h': '运动', 's': '男', 'a': 18}

2)对象操作对象中的单个属性:万能的点 .

class Human:
    mind = '有思想'
    language = '实用语言'

    def __init__(self, name, sex, age, hobby):
        # self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby


obj = Human('barry', '男', 18, '运动')
obj.job = 'IT'  # 增
del obj.n  # 删
obj.s = '女'  # 改
print(obj.s)  # 查
print(obj.__dict__)  # {'s': '女', 'a': 18, 'h': '运动', 'job': 'IT'}

1.3.3、对象查看类中的属性

class Human:
    mind = '有思想'
    language = '实用语言'

    def __init__(self, name, sex, age, hobby):
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby


obj = Human('barry', '男', 18, '运动')
print(obj.mind)  # 有思想
print(obj.language)  # 实用语言
obj.a = 666
print(obj.a)  # 666

1.3.4、对象操作类中的方法

class Human:
    mind = '有思想'
    language = '实用语言'

    def __init__(self, name, sex, age, hobby):
        self.n = name
        self.s = sex
        self.a = age
        self.h = hobby

    def work(self):
        print(self)
        print('人类会工作')

    def tools(self):
        print('人类会使用工具')


obj = Human('barry', '男', 18, '运动')
obj.work()
obj.tools()

类中的方法一般都是通过对象执行的(除去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self

self定义:self其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个就是对象

1.4、类空间问题

1.4.1、何处可以添加对象属性

class A:
    def __init__(self, name):
        self.name = name

    def func(self, sex):
        self.sex = sex


# 类外面可以:
obj = A('barry')
obj.age = 18
print(obj.__dict__)  # {'name': 'barry', 'age': 18}

# 类内部也可以:
obj = A('barry')  # __init__方法可以。
obj.func('男')  # func 方法也可以。

总结:对象的属性不仅可以在__ init__里面添加,还可以在类的其他方法或者类的外面添加

1.4.2、何处可以添加类的静态属性

class A:
    def __init__(self, name):
        self.name = name

    def func(self, sex):
        self.sex = sex

    def func1(self):
        A.bbb = 'ccc'


# 类的外部可以添加
A.aaa = 'taibai'
print(A.__dict__['aaa'])    # taibai

# 类的内部也可以添加。
A.func1(111)
print(A.__dict__['bbb'])    # ccc

总结:类的属性不仅可以在类内部添加,还可以在类的外部添加

1.4.3、对象如何找到类的属性

 


对象查找属性的顺序:先从对象空间找 ------> 类空间找 ------> 父类空间找 ------->.....

 

类名查找属性的顺序:先从本类空间找 -------> 父类空间找--------> ........

1.5、类与类之间的关系

1.5.1、依赖关系

依赖关系: 将一个类的类名或者对象传给另一个类的方法中

class Elephant:
    def __init__(self, name):
        self.name = name

    def open(self, ref):
        # print(ref)
        print(f'{self.name}默念三声: 芝麻开门,{ref.name}冰箱门打开')
        ref.open_door()     # 调用其他对象的方法

    def close(self):
        print('大象默念三声:芝麻关门')


class Refrigerator:
    def __init__(self, name):
        self.name = name

    def open_door(self):
        print(f'{self.name}冰箱门被打开了....')

    def close_door(self):
        print(f'{self.name}冰箱门被关上了....')


ele = Elephant('琪琪')
ref = Refrigerator('美菱')
ele.open(ref)

1.5.2、组合关系

组合: 将一个类的对象封装成另一个类的对象的属性

class Boy:

    def __init__(self, name):
        self.name = name

    def meet(self, girl_friend=None):
        self.girl_friend = girl_friend

    def have_diner(self):
        if self.girl_friend:
            print(f'{self.name}请年龄为:{self.girl_friend.age},姓名为{self.girl_friend.name}一起吃六块钱的麻辣烫')
            self.girl_friend.shopping(self)
        else:
            print('单身狗,吃什么吃')


class Girl:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def shopping(self, boy_friend):
        print(f'{boy_friend.name},{self.name}一起去购物!')

wu = Boy('吴超')
flower = Girl('如花', 48)
wu.meet(flower)
wu.have_diner()
"""
吴超请年龄为:48,姓名为如花一起吃六块钱的麻辣烫
吴超,如花一起去购物!
"""

需求:模拟英雄联盟写一个游戏人物的类

1.创建一个 Game_role的类.
2.构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
1.创建一个attack方法,此方法是实例化两个对象,互相攻击的功能: 例: 实例化一个对象 盖伦,ad为10, hp为100 实例化另个一个对象 剑豪 ad为20, hp为80 盖伦通过attack方法攻击剑豪,方法要完成 '谁攻击谁,谁掉了多少血, 还剩多少血'的提示功能.

class GameRole:

    def __init__(self, name, ad, hp):
        self.name = name
        self.ad = ad
        self.hp = hp

    def attack(self, p1):
        p1.hp = p1.hp - self.ad
        print(f'{self.name}攻击{p1.name},{p1.name}掉了{self.ad}血,还剩{p1.hp}血')

    def equit_weapon(self, weapon):
        self.weapon = weapon  # 组合: 给对象封装了一个为weapon属性


class Weapon:

    def __init__(self, name, ad):
        self.name = name
        self.ad = ad

    def weapon_attack(self, p1, p2):
        p2.hp = p2.hp - self.ad
        print(f'{p1.name}利用{self.name}给了{p2.name}一下,{p2.name}还剩{p2.hp}血')

gailun = GameRole('盖伦', 10, 100)
zhaoxin = GameRole('赵信', 20, 90)
great_sword = Weapon('宝剑', 30)
gailun.equit_weapon(great_sword)  # 依赖关系
gailun.weapon.weapon_attack(gailun, zhaoxin)

1.6、类的约束

1)方式一
提取⽗类,然后在⽗类中定义好⽅法. 在这个⽅法中什么都不⽤⼲. 就抛⼀个异常就可以了. 这样所有的⼦类都必须重写这个⽅法. 否则. 访问的时候就会报错.

class Payment:
    """
    此类什么都不做,就是制定一个标准,谁继承我,必须定义我里面的方法。
    """

    def pay(self, money):
        raise Exception("你没有实现pay方法")


class QQpay(Payment):
    def pay(self, money):
        print('使用qq支付%s元' % money)


class Alipay(Payment):
    def pay(self, money):
        print('使用阿里支付%s元' % money)


class Wechatpay(Payment):
    # 未实现pay方法报错
    # def fuqian(self, money):
    #     print('使用微信支付%s元' % money)

    def pay(self, money):
        print(f'使用微信支付{money}元')


def pay(obj, money):
    obj.pay(money)


a = Alipay()
b = QQpay()
c = Wechatpay()
pay(a, 100)
pay(b, 200)
pay(c, 300)

2)方式二
使⽤元类来描述⽗类. 在元类中给出⼀个抽象⽅法. 这样⼦类就不得不给出抽象⽅法的具体实现

from abc import ABCMeta, abstractmethod


class Payment(metaclass=ABCMeta):  # 抽象类 接口类  规范和约束  metaclass指定的是一个元类
    @abstractmethod
    def pay(self, money):  # 抽象方法
        pass


class Alipay(Payment):
    def pay(self, money):
        print('使用支付宝支付了%s元' % money)


class QQpay(Payment):
    def pay(self, money):
        print('使用qq支付了%s元' % money)


class Wechatpay(Payment):
    def pay(self,money):
        print('使用微信支付了%s元'%money)
    # def recharge(self): pass    # TypeError: Can't instantiate abstract class Wechatpay with abstract methods pay


def pay(a, money):
    a.pay(money)


a = Alipay()
pay(a, 100)  # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能

q = QQpay()
pay(q, 100)

w = Wechatpay()
pay(w, 100)  # 到用的时候才会报错

二、面向对象:继承

2.1、什么是继承

# 继承的用法:
class Aniaml(object):
    def __init__(self, name, sex, age):
        self.name = name
        self.age = age
        self.sex = sex


class Person(Aniaml):
    pass

class Cat(Aniaml):
    pass

class Dog(Aniaml):
    pass

继承优点:

  • 1)增加了类的耦合性(耦合性不宜多,宜精)
  • 2)减少了重复代码
  • 3)使得代码更加规范化,合理化

2.2、单继承

2.2.1、类名,对象执行父类方法

class Aniaml(object):
    type_name = '动物类'

    def __init__(self, name, sex, age):
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self):
        print(self)
        print('吃东西')


class Person(Aniaml):
    pass


class Cat(Aniaml):
    pass


class Dog(Aniaml):
    pass


# 类名:
print(Person.type_name)  # 可以调用父类的属性,方法。
Person.eat(111)

# 对象:
p1 = Person('春哥', '男', 18)
print(p1.__dict__)  # {'name': '春哥', 'age': 18, 'sex': '男'}
# 对象执行类的父类的属性,方法。
print(p1.type_name)
p1.type_name = '666'
print(p1.__dict__)  # {'name': '春哥', 'age': 18, 'sex': '男', 'type_name': '666'}
p1.eat()

2.2.2、执行顺序

class Aniaml(object):
    type_name = '动物类'

    def __init__(self, name, sex, age):
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self):
        # print(self)
        print('吃东西')


class Person(Aniaml):
    def eat(self):
        # print('%s 吃饭' % self.name)
        print(f'{self.name} 吃饭')


class Cat(Aniaml):
    pass


class Dog(Aniaml):
    pass


p1 = Person('barry', '男', 18)
# 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找。
p1.eat()
# 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。

2.2.3、同时执行类以及父类方法

1)方式一:父类.func(对象,其他参数)

class Aniaml(object):
    type_name = '动物类'

    def __init__(self, name, sex, age):
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self):
        print('吃东西')


class Person(Aniaml):
    def __init__(self, name, sex, age, mind):
        Aniaml.__init__(self, name, sex, age)  # 方法一
        self.mind = mind

    def eat(self):
        super().eat()
        print('%s 吃饭' % self.name)


class Cat(Aniaml):
    pass


class Dog(Aniaml):
    pass


# 方法一:Aniaml.__init__(self,name,sex,age)
p1 = Person('春哥', 'laddboy', 18, '有思想')  
print(p1.__dict__)      # {'name': '春哥', 'age': 18, 'sex': 'laddboy', 'mind': '有思想'}
p1.eat()

2)方式二:super().func(参数)

class Aniaml(object):
    type_name = '动物类'

    def __init__(self, name, sex, age):
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self):
        print('吃东西')


class Person(Aniaml):
    def __init__(self, name, sex, age, mind):
        # super(Person,self).__init__(name,sex,age)  # 方法二
        super().__init__(name, sex, age)  # 方法二
        self.mind = mind

    def eat(self):
        super().eat()
        print('%s 吃饭' % self.name)


class Cat(Aniaml):
    pass


class Dog(Aniaml):
    pass


p1 = Person('春哥', 'laddboy', 18, '有思想')
print(p1.__dict__)  # {'name': '春哥', 'age': 18, 'sex': 'laddboy', 'mind': '有思想'}

2.2.4、单继承练习

class Base:

    def __init__(self, num):
        self.num = num

    def func1(self):
        print(self.num)


class Foo(Base):
    pass


obj = Foo(123)
obj.func1()  # 123

# -------------------------------------------------
class Base:
    def __init__(self, num):
        self.num = num

    def func1(self):
        print(self.num)


class Foo(Base):

    def func1(self):
        print("Foo. func1", self.num)


obj = Foo(123)
obj.func1()  # Foo. func1 123

# -------------------------------------------------
class Base:
    def __init__(self, num):  # 2
        self.num = num

    def func1(self):  # 4
        print(self.num)  # 123
        self.func2()  # self ---> obj  # 对象查询顺序:

    def func2(self):
        print("Base.func2")


class Foo(Base):
    def func2(self):
        print("Foo.func2")


obj = Foo(123)  # 1
obj.func1()  # 3
'''
123
Foo.func2
'''

# -------------------------------------------------
class Base:
    def __init__(self, num):
        self.num = num

    def func1(self):
        print(self.num)
        self.func2()

    def func2(self):
        print(111, self.num)


class Foo(Base):

    def func2(self):
        print(222, self.num)


lst = [Base(1), Base(2), Foo(3)]

for obj in lst:
    obj.func2()
'''
111 1
111 2
222 3
'''

# -------------------------------------------------
class Base:

    def __init__(self, num):
        self.num = num

    def func1(self):
        print(self.num)
        self.func2()

    def func2(self):
        print(111, self.num)


class Foo(Base):

    def func2(self):
        print(222, self.num)


lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
    obj.func1()
'''
1
111 1
2
111 2
3
222 3
'''

2.2.5、super深入理解

super是严格按照类的继承顺序(mro算法)执行
1)示例一

class A:
    def f1(self):
        print('in A f1')

    def f2(self):
        print('in A f2')


class Foo(A):
    def f1(self):
        super().f2()
        print('in A Foo')


obj = Foo()
obj.f1()
"""
in A f2
in A Foo
"""

2)示例二

class A:
    def f1(self):
        print('in A')


class Foo(A):
    def f1(self):
        super().f1()
        print('in Foo')


class Bar(A):
    def f1(self):
        print('in Bar')


class Info(Foo, Bar):
    def f1(self):
        super().f1()
        print('in Info f1')


obj = Info()
obj.f1()

'''
in Bar
in Foo
in Info f1
'''
print(
    Info.mro())  # [<class '__main__.Info'>, <class '__main__.Foo'>, <class '__main__.Bar'>, <class '__main__.A'>, <class 'object'>]

3)示例三

class A:
    def f1(self):
        print('in A')


class Foo(A):
    def f1(self):
        super().f1()
        print('in Foo')


class Bar(A):
    def f1(self):
        print('in Bar')


class Info(Foo, Bar):
    def f1(self):
        super(Foo, self).f1()   # 多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位
        print('in Info f1')

print(Info.mro())   # [<class '__main__.Info'>, <class '__main__.Foo'>, <class '__main__.Bar'>, <class '__main__.A'>, <class 'object'>]
print(Foo.mro())    # [<class '__main__.Foo'>, <class '__main__.A'>, <class 'object'>]
obj = Info()
obj.f1()

super()总结:
super() 严格意义并不是执行父类的方法.单继承: super() 肯定是执行父类的方法.多继承: super(S,self) 严格按照self从属于的类的mro的执行顺序,执行 S类的下一位.

2.3、多继承

class God:

    def fly(self):
        print('会飞')

    def climb(self):
        print('神仙累了也需要爬树')


class Monkey:

    def climb(self):
        print('爬树')


class MonkeySun(God, Monkey):
    pass


# 多继承的难点就是继承顺序的问题
sun = MonkeySun()
sun.climb()  # 神仙累了也需要爬树
print(MonkeySun.mro())  
# 继承顺序是根据类的mro()算法计算的
# [<class '__main__.MonkeySun'>, <class '__main__.God'>, <class '__main__.Monkey'>, <class 'object'>]

2.4、关键字:isinstance 与 issubclass

# isinstance 判断的是对象与类的关系
class A:
    pass


class B(A):
    pass


obj = B()

# isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
print(isinstance(obj, B))  # True
print(isinstance(obj, A))  # True


# ----------------------------------------
# issubclass 类与类之间的关系

class A:
    pass


class B(A):
    pass


class C(B):
    pass


# issubclass(a,b) 判断的是 a类是否是b类 或者 b类派生类 的派生类.
# issubclass(a,b) 判断的是 a类是否是b类 子孙类.
print(issubclass(B, A))  # True
print(issubclass(C, A))  # True

2.5、元类

type元类又称作构建类,python中大多数内置的类(包括object)以及自己定义的类,都是由type元类创造的

type类与object类之间的关系比较独特:object是type类的实例,而type类是object类的子类

obj = A()
print(type('abc'))      # <class 'str'>
print(type([1, 2, 3]))  # <class 'list'>
print(type((22, 33)))   # <class 'tuple'>

# type 获取对象从属于的类
print(type(A))  # <class 'type'>
print(type(str))    # <class 'type'>
print(type(dict))   # <class 'type'>

# python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构建类)实例化得来的.

# type 与 object 的关系.
print(type(object))  # <class 'type'> object类是type类的一个实例.
# object类是type类的父类.
print(issubclass(type, object))  # True

三、面向对象:封装

3.1、什么是封装

封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想

3.2、封装内容调用

1)通过对象直接调用被封装的内容

class Foo:

    def __init__(self, name, age):
        self.name = name
        self.age = age


obj1 = Foo('wupeiqi', 18)
print(obj1.name)  # 直接调用obj1对象的name属性
print(obj1.age)  # 直接调用obj1对象的age属性

obj2 = Foo('alex', 73)
print(obj2.name)  # 直接调用obj2对象的name属性
print(obj2.age)  # 直接调用obj2对象的age属性

2)通过self间接调用被封装的内容

class Foo:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def detail(self):
        print(self.name)
        print(self.age)


obj1 = Foo('wupeiqi', 18)
obj1.detail()

obj2 = Foo('alex', 73)
obj2.detail()

综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封装的内容

四、面向对象:多态

4.1、什么是多态

多态指的是一类事物有多种形态,多态指出了如何通过他们共同的属性和动作来操作及访问,而不需要考虑他们集体的类

# 多态
import abc


class Animal(metaclass=abc.ABCMeta):  # 同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass


class People(Animal):  # 动物的形态之一:人
    def talk(self):
        print('say hello')


class Dog(Animal):  # 动物的形态之二:狗
    def talk(self):
        print('say wangwang')


class Pig(Animal):  # 动物的形态之三:猪
    def talk(self):
        print('say aoao')


# -------------------------------------------
class H2O:
    def __init__(self, name, temperature):
        self.name = name
        self.temperature = temperature

    def turn_ice(self):
        if self.temperature < 0:
            print('[%s]温度太低结冰了' % self.name)
        elif self.temperature > 0 and self.temperature < 100:
            print('[%s]液化成水' % self.name)
        elif self.temperature > 100:
            print('[%s]温度太高变成了水蒸气' % self.name)


class Water(H2O):
    pass


class Ice(H2O):
    pass


class Steam(H2O):
    pass


w1 = Water('水', 25)
i1 = Ice('冰', -20)
s1 = Steam('蒸汽', 3000)

4.2、鸭子模型

class A:

    def login(self):
        pass

    def register(self):
        pass


class B:

    def login(self):
        pass

    def register(self):
        pass

# A,B两个类,没有任何关系,独立两个,但是里面的功能相似,所以python一般会将类似于A,B两个类里面的相似的功能让其命名相同.
# A,B虽然无关系,但是很默契的制定了一个规范.让你使用起来更方便.
# str  tuple list 都有 index方法,这就是统一了规范

五、类的成员

5.1、细分类的成员

class A:
    company_name = '点筹'  # 静态变量(静态字段)
    __iphone = '1353333xxxx'  # 私有静态变量(私有静态字段)

    def __init__(self, name, age):  # 特殊方法
        self.name = name  # 对象属性(普通字段)
        self.__age = age  # 私有对象属性(私有普通字段)

    def func1(self):  # 普通方法
        pass

    def __func(self):  # 私有方法
        print(666)

    @classmethod  # 类方法
    def class_func(cls):
        """ 定义类方法,至少有一个cls参数 """
        print('类方法')

    @staticmethod  # 静态方法
    def static_func():
        """ 定义静态方法 ,无默认参数"""
        print('静态方法')

    @property  # 属性
    def prop(self):
        pass

5.2、类的私有成员

5.2.1、静态字段

静态字段(静态属性):

  • 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
  • 私有静态字段:仅类内部可以访问

1)公有静态字段

class C:
    name = "公有静态字段"

    def func(self):
        print(C.name)


class D(C):

    def show(self):
        print(C.name)


# 类访问
print(C.name)
# 类内部可以访问
obj = C()
obj.func()
# 派生类中可以访问
obj_son = D()
obj_son.show()

2)私有静态字段

class C:
    __name = "私有静态字段"

    def func(self):
        print(C.__name)


class D(C):

    def show(self):
        print(C.__name)


# print(C.__name)  # 不可在外部访问

obj = C()
# print(obj.__name)  # 不可在外部访问
obj.func()  # 类内部可以访问

# obj_son = D()
# obj_son.show()  # 不可在派生类中可以访问

5.2.2、普通字段(对象属性)

普通字段(对象属性)

  • 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
  • 私有普通字段:仅类内部可以访问;

1)公有普通字段

class C:
    def __init__(self):
        self.foo = "公有字段"

    def func(self):
        print(self.foo)  # 类内部访问


class D(C):
    def show(self):
        print(self.foo)  # 派生类中访问


obj = C()
print(obj.foo)  # 通过对象可以访问
obj.func()  # 类内部可以访问

obj_son = D()
obj_son.show()  # 派生类中访问

2)私有普通字段

class C:
    def __init__(self):
        self.__foo = "私有字段"
        
    def func(self):
        print(self.__foo)  # 类内部访问


class D(C):
    def show(self):
        print(self.__foo)  # 派生类中访问


obj = C()

# print(obj.__foo)  # 通过对象访问    ==> 错误
obj.func()  # 类内部访问        ==> 正确

# obj_son = D()
# obj_son.show()  # 派生类中访问  ==> 错误

5.2.3、方法

方法:

  • 公有方法:对象可以访问;类内部可以访问;派生类中可以访问
  • 私有方法:仅类内部可以访问;

1)公有方法

class C:
    def __init__(self):
        pass

    def add(self):
        print('in C')


class D(C):
    def show(self):
        print('in D')

    def func(self):
        self.show()


obj = D()
obj.show()  # 通过对象访问
obj.func()  # 类内部访问
obj.add()  # 派生类中访问

2)私有方法

class C:
    def __init__(self):
        pass

    def __add(self):
        print('in C')


class D(C):
    def __show(self):
        print('in D')

    def func(self):
        self.__show()


obj = D()
# obj.__show()  # 通过不能对象访问
obj.func()  # 类内部可以访问
# obj.__add()  # 派生类中不能访问

总结:

对于这些私有成员来说,他们只能在类的内部使用,不能再类的外部以及派生类中使用

PS:非要访问私有成员的话,可以通过 对象._ 类__属性名,但是绝对不允许

因为类在创建时,如果遇到了私有成员(包括私有静态字段,私有普通字段,私有方法)它会将其保存在内存时自动在前面加上_类名.

5.3、类的其他成员

1)实例方法
定义:第一个参数必须是实例对象,该参数名一般约定为self,通过它来传递实例的属性和方法(也可以传类的属性和方法);

调用:只能由实例对象调用。
2)类方法
定义:使用装饰器@classmethod。第一个参数是当前类对象,该参数名一般约定为cls,通过它来传递类的属性和方法(不能传实例的属性和方法);

调用:实例对象和类对象都可以调用。

class Student:
    __num = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Student.addNum()  # 写在__new__方法中比较合适,暂且放到这里

    @classmethod
    def addNum(cls):
        cls.__num += 1

    @classmethod
    def getNum(cls):
        return cls.__num


a = Student('A', 18)
b = Student('B', 36)
c = Student('C', 73)
print(Student.getNum())

3)静态方法
定义:使用装饰器@staticmethod。参数随意,没有self和cls参数,但是方法体中不能使用类或实例的任何属性和方法;

调用:实例对象和类对象都可以调用。

静态方法主要是用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护

import time


class TimeTest(object):
    def __init__(self, hour, minute, second):
        self.hour = hour
        self.minute = minute
        self.second = second

    @staticmethod
    def showTime():
        return time.strftime("%H:%M:%S", time.localtime())


print(TimeTest.showTime())  # 类直接调用
t = TimeTest(2, 10, 10)
nowTime = t.showTime()      # 对象调用
print(nowTime)

4)双下方法(后面会讲到)
定义:双下方法是特殊方法,他是解释器提供的由双下划线加方法名加双下划线具有特殊意义的方法,双下方法主要是python源码程序员使用的,

我们在开发中尽量不要使用双下方法,但是深入研究双下方法,更有益于我们阅读源码

5.4、属性

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

class People:
    def __init__(self, name, weight, height):
        self.name = name
        self.weight = weight
        self.height = height

    @property
    def bmi(self):
        return self.weight / (self.height ** 2)


p1 = People('egon', 75, 1.85)
print(p1.bmi)

由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

class Foo:
    @property
    def AAA(self):
        print('get的时候运行我啊')

    @AAA.setter
    def AAA(self, value):
        print('set的时候运行我啊')

    @AAA.deleter
    def AAA(self):
        print('delete的时候运行我啊')


# 只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
f1 = Foo()
f1.AAA
f1.AAA = 'aaa'
del f1.AAA
"""
get的时候运行我啊
set的时候运行我啊
delete的时候运行我啊
"""

# -------------------------------------------------------
# 或者:
class Foo:
    def get_AAA(self):
        print('get的时候运行我啊')

    def set_AAA(self, value):
        print('set的时候运行我啊')

    def delete_AAA(self):
        print('delete的时候运行我啊')

    AAA = property(get_AAA, set_AAA, delete_AAA)  # 内置property三个参数与get,set,delete一一对应


f1 = Foo()
f1.AAA
f1.AAA = 'aaa'
del f1.AAA

商品实例:

class Goods(object):

    def __init__(self):
        # 原价
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    @property
    def price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    @price.setter
    def price(self, value):
        self.original_price = value

    @price.deleter
    def price(self):
        del self.original_price

obj = Goods()
print(obj.price)         # 获取商品价格
obj.price = 200   # 修改商品原价
print(obj.price)
del obj.price     # 删除商品原价

5.5、函数 VS 方法

1)通过打印函数(方法)名确定

def func():
    pass


print(func)  # <function func at 0x00000260A2E690D0>


class A:
    def func(self):
        pass


print(A.func)  # <function A.func at 0x0000026E65AE9C80>
obj = A()
print(obj.func)  # <bound method A.func of <__main__.A object at 0x00000230BAD4C9E8>>

2)通过types模块验证

from types import FunctionType
from types import MethodType


def func():
    pass


class A:
    def func(self):
        pass


obj = A()

print(isinstance(func, FunctionType))  # True
print(isinstance(A.func, FunctionType))  # True
print(isinstance(obj.func, FunctionType))  # False
print(isinstance(obj.func, MethodType))  # True

3)静态方法是函数

from types import FunctionType
from types import MethodType


class A:

    def func(self):
        pass

    @classmethod
    def func1(self):
        pass

    @staticmethod
    def func2(self):
        pass


obj = A()

# 类方法
print(isinstance(A.func1, MethodType))  # True
print(isinstance(obj.func1, MethodType))  # True
# 静态方法其实是函数
print(isinstance(A.func2, FunctionType))  # True
print(isinstance(obj.func2, FunctionType))  # True

总结:函数都是显性传参,方法都是隐性传参

六、反射

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

6.1、对象的反射

class Foo:
    f = '类的静态变量'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hi(self):
        print('hi,%s' % self.name)


obj = Foo('egon', 73)

# 检测是否含有某属性
print(hasattr(obj, 'name'))     # True
print(hasattr(obj, 'say_hi'))   # True

# 获取属性
n = getattr(obj, 'name')
print(n)    # egon
func = getattr(obj, 'say_hi')
func()      # hi,egon

print(getattr(obj, 'aaaaaaaa', '不存在啊'))  # 默认设置

# 设置属性
setattr(obj, 'sb', True)
setattr(obj, 'show_name', lambda self: self.name + 'abc')
print(obj.__dict__)     # {'name': 'egon', 'age': 73, 'sb': True, 'show_name': <function <lambda> at 0x000002E2F1EDE828>}
print(obj.show_name(obj))   # egonabc

# 删除属性
delattr(obj, 'age')
delattr(obj, 'show_name')
# delattr(obj, 'show_name111')  # 不存在,则报错
print(obj.__dict__) # {'name': 'egon', 'sb': True}

6.2、类的反射

class Foo(object):
    staticField = "酸菜鱼"

    def __init__(self):
        self.name = 'wupeiqi'

    def func(self):
        return 'func'

    @staticmethod
    def bar():
        return 'bar'

f = Foo()
print(getattr(Foo, 'staticField'))
print(getattr(Foo, 'func')(f))
print(getattr(Foo, 'bar')())

6.3、当前模块的反射

import sys


def s1():
    print('s1')


def s2():
    print('s2')


this_module = sys.modules[__name__]
print(this_module)

print(hasattr(this_module, 's1'))   # True
getattr(this_module, 's2')()    # s2

6.4、其他模块的反射

其他模块:

# 文件名:tbjx.py

name = '酸菜鱼'

def func():
    print('in tbjx func')



class C:
    area = '北京'

    def __init__(self,name):
        self.name = name

    def func(self):
        print('in B func')

其他模块的反射:

import tbjx

print(getattr(tbjx, 'name'))
getattr(tbjx, 'func')()

# 1. 找到tbjx对象 的C类,实例化一个对象.
print(getattr(tbjx, 'C'))
obj = getattr(tbjx, 'C')('123')
print(obj)

# 2. 找到tbjx对象 的C类,通过对C类这个对象使用反射取到area.
print(getattr(tbjx.C, 'area'))

# 3. 找到tbjx对象 的C类,实例化一个对象,对对象进行反射取值.
obj = getattr(tbjx, 'C')('abc')
print(obj.name)
print(getattr(obj, 'name'))

6.5、反射的应用

class User:
    def login(self):
        print('欢迎来到登录页面')

    def register(self):
        print('欢迎来到注册页面')

    def save(self):
        print('欢迎来到存储页面')


user = User()
while 1:
    choose = input('>>>').strip()
    if hasattr(user, choose):
        func = getattr(user, choose)
        func()
    else:
        print('输入错误。。。。')

七、双下划线方法

7.1、__ len__方法

# len 一个对象就会触发 __len__方法
class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __len__(self):
        return len(self.__dict__)
a = A()
print(len(a)) # 2

7.2、__ hash__方法

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __hash__(self):
        return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))

7.3、__ str__方法

如果一个类中定义了__ str__方法,那么在打印 对象 时,默认输出该方法的返回值,类似java的toString()方法

class A:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'A [name = {self.name}, age = {self.age}]'


a = A('酸菜鱼', 18)
print(a)    # A [name = 运维人在路上, age = 18]

7.4、__ repr__方法

# repr
# print('我叫%s' % ('运维人在路上'))  # 我叫运维人在路上
# print('我叫%r' % ('运维人在路上'))  # 我叫'运维人在路上'
# print(repr('fdsaf'))    # 'fdsaf'

class A:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        print(666)
        return f'姓名: {self.name} 年龄: {self.age}'


a = A('AA', 35)
b = A('BB', 56)
c = A('CC', 18)
# print(a)
print(repr(a))

7.5、__ call__方法

对象后面加括号,触发执行。

注:构造方法__ new__的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __ call__ 方法的执行是由对象后加括号触发的,即:对象()或者类()()

class Foo:

    def __init__(self):
        print('__init__')
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

7.6、__ eq__方法

比较两个对象是否相等,类似java中的equals()方法

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __eq__(self, obj):
        if self.a == obj.a and self.b == obj.b:
            return True


a = A()
b = A()
print(a == b)   # True

7.7、__ del__方法

析构方法,当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

7.8、__ new__方法

对象是object类的__ new__方法 产生的,使用** 类名()**创建对象,发生了如下事情:

1.先触发 object的__ new__方法,此方法在内存中开辟一个对象空间.
2.执行__init __方法,给对象封装属性.

class A(object):

    def __init__(self):

        self.x = 1
        print('in init function')

    def __new__(cls, *args, **kwargs):
        print('in new function')
        return object.__new__(A)

# 对象是object类的__new__方法 产生的.
a = A()
'''
in new function
in init function
'''

单例模式:

class A:
    __instance = None

    def __init__(self, name):
        self.name = name

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance


obj = A('AAA')
print(obj.name)  # AAA
obj1 = A('BBB')
print(obj1.name)  # BBB
print(obj.name)  # BBB

7.9、__ item__系列

class Foo:
    def __init__(self, name):
        self.name = name

    def __getitem__(self, item):
        print(self.__dict__[item])

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        print('del obj[key]时,我执行')
        self.__dict__.pop(key)

    def __delattr__(self, item):
        print('del obj.key时,我执行')
        self.__dict__.pop(item)


f1 = Foo('AAA')
f1['age'] = 18
f1['height'] = 19
print(f1.__dict__)  # {'name': 'AAA', 'age': 18, 'height': 19}

del f1.height   # del obj.key时,我执行
del f1['age']   # del obj[key]时,我执行
f1['name'] = '酸菜鱼'
print(f1.__dict__)  # {'name': '酸菜鱼'}
我大学整理的最全的Java面向对象编程,学不会看不懂你来打我 文章目录Java面向对象编程类和对象面向对象编程面向对象编程的概念类和对象以及引用类和对象的概念对象的创建引用的定义成员变量的初始值成员方法成员方法的定义返回值类型的详解形参列表的详解方法体的详解方法的调用可变长参数方法传参的过程参数传递的注意事项内存结构之栈区传参的相关概念方法和封装构造方法默认构造方法构造方法的作用方法重载重载的体现形式重载的实际意义this关键字工作原理使用方式注意事项方法递归调用递归的基本概念注意事项封装封装的概念封装的实现流程JavaBean的概念static关键字和继承stati 阅读详情

相关推荐

从零学Java(1)之面向对象

引言: ♀ 小AD:小明哥,月底了,我想上波分! ♂ 明世隐:那你就去上啊,小鲁班直接撸上去。 ♀ 小AD:不我不用她,太SB,经常直接去世。 ♂ 明世隐:她会SB?你不会用吧,你什么连招? ♀ 小AD:还有连招?有技能就放,没技能就A。 ♂ 明世隐:这。。。,难怪 ♀ 小AD:那你说说看。 ♂ 明世隐:3技能起手,接A突突突突,1技能,接A突突突突,当敌人突脸则2技能推走,然后A突突突突。反正扔完技能穿插平A。敌人残血逃跑就送他一发超级火箭,他会感谢你。 ♀ 小AD:为啥?我就随便A,有什么放什么。 ♂

编程界明世隐的博客 3931

java面向对象学不会?看完就会了

1.什么是面向对象 众所周知java是面向对象的编程语言,那么什么是面向对象呢,大家经常把面向对象和面向过程混淆,下面就说个例子,一秒就会! 例如小明有一些脏衣服需要去洗干净,这是就相当于一个命令把衣服洗干净 A:面向过程:小明需要自己独立完成,打水、放洗衣液、搓衣服等等一些列操作直至衣服洗干净 B:面向对象:小明不需要自己独立完成,但是他需要把衣服送到具有洗衣服功能的地方,例如洗衣房,你需要办一张会员卡,然后对工作人员说:我不管你用什么办法,总之给我洗干净就行 2.面向对象格式 首先需要一个类,这里面不写

weixin_45092997的博客 515

GQA数据集介绍

GQA,这是一个用于真实世界视觉推理和组合问答的新数据集。2200万个不同的推理问题,所有这些问题都带有表示其语义的功能程序。答案分布受到严格控制。11.3万张图像、2200万个问题,推理能力有对象和属性识别、传递关系跟踪、空间推理、逻辑推理和比较。

qq_56551150的博客 2954

面向对象与面向过程的简单比较

这两个概念对于很多学习编程的人来说可能都不明白,或者可以说无法具体理解的,包括我也是,之前曾经查过相关资料,可是今天想想又有点模糊了,于是重新去理解了下,结果发现了下面这份资料,感觉不错,至少举例来说明比较,会让人比较容易理解以下是转载内容------------------------------------------------------------------------------

天涯 书塾 2070

解密携程风控:user-dun算法中的自定义base64与多模式加密机制剖析

本文深入剖析了携程旅行APP风控核心组件libduncode.so中的user-dun算法。文章重点解密了其采用的自定义Base64编码机制与多模式加密选择逻辑,并详细阐述了如何通过动态分析与静态还原,理解算法与设备指纹的深度绑定关系,为逆向分析类似混淆加固的风控算法提供了系统的方法论。

weixin_29323049的博客 340

重带电粒子的能量歧离(energy straggling)

能量歧离,Bethe-Bloch

G751888629的博客 2298

07-面向对象与面向过程的区别

哪些代码设计看似是面向对象,实际是面向过程的? 1. 滥用 getter、setter 方法 它违反了面向对象编程的封装特性,相当于将面向对象编程风格退化成了面向过程编程风格。在设计实现类的时候,除非真的需要,否则,尽量不要给属性定义 setter 方法。除此之外,尽管 getter 方法相对 setter 方法要安全些,但是如果返回的是集合容器(比如例子中的 List 容器),也要防范集合内部数据被修改的危险。 2. 滥用全局变量和全局...

司马世豪的博客 300

Django 小实例S1 简易学生选课管理系统 —— 〇、初步介绍与演示

python Django实现的一个简易的教务选课系统。 介绍与演示的视频版本已发到我的b站: https://www.bilibili.com/video/BV1er4y1w7ty。 项目已上传到我的github: https://github.com/BigShuang/SimpleStudentCourseManagementSystem。 S1总目录: 〇、初步介绍与演示 一、项目流程梳理与数据库设计 ======================= 大爽歌作,made by big shuang.

大爽老师的博客 5944

面向对象与面向过程

1.面向过程 传统面向过程的编程思想总结起来就8个字——自顶向下,逐步细化 2.面向对象 万物皆对象 面向过程主要针对功能,而面向对象主要是针对能够实现该功能的背后的实体。面向对象实质是面向实体,所以在使用面向对象进行编程时,要建立这样一个观念:万物皆对象。 3.面向过程与面向对象的区别 面向过程:简单直接,易于入门理解,模块化程度低 面向对象:相对于面向过程比较复杂,不易理解,模块化程度较高。从维护和扩展功能的角度上来看,面向对象远比面向过程简单。 通俗来讲面向过程就好像是蛋炒饭 面向对象就好像是盖浇饭。

qq_52754410的博客 318

单细胞双胞过滤-scrublet安装

pip install scrublet ----use-pep517有如下报错,分析可知安装annoy时不会自动更新gcc的版本,centos默认是4.8.5。pip install scrublet ----use-pep517 仍然报错,但似乎不影响使用,提示Successfully installed。打开终端,进入Python环境,输入以下代码,查看Python安装位置。暂时还没尝试是否存在问题,如果存在问题,降级scrublet版本。包的开发依赖的是比较低版本的numpy,会用到。

hzau_t的博客 792

数据获取竟如此简单——全球SRTM 90m DEM V4.1数据

SRTM(Shuttle Radar Topography Mission)是由NASA联合国际合作伙伴开展的雷达地形测绘项目,通过航天飞机搭载的合成孔径雷达系统,于2000年通过发射并接收地表反射的雷达信号,获取全球三维地形数据,这一任务填补了高精度全球地形数据的空白。而本文通过十余行的python代码,就更简单、方便地获取这些数据。

m0_38065162的博客 1399

面向对象傻傻搞不清楚,有这一篇就够了

1.面向对象概念 首先面向对象是相对于面向过程而言的 面向过程是一种思想,意思是我们要做任何事,都需要亲力亲为,强调的是过程。 面向对象oop(Object Oriented Programming)也是一种编程思想,相对于面向过程,我们可以由原来问题的执行者变为指挥者,进而把生活中很多复杂的问题变得简单化,强调结果 java是一门面向对象的语言 2 面向对象的三大特征 封装: 把相关的数据封装成一个“类”组件 继承: 是子类自动共享父类属性和方法,这是类之间的一种关系 多态: 增强软件.

weixin_59606855的博客 817

openclaw update时出现Skipped:this OpenClaw install isn‘t a git checkout,and the package manager解决方案

本文主要介绍了openclaw update时出现openclaw update时出现Skipped:this OpenClaw install isn’t a git checkout,and the package manager解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

JAVA面向对象知识点—全面详解

继承、重写、final关键字 工具类String、Math、Arrays类 封装 异常 -包装类、内部类、正则表达式、日期类、BigDecimal类 Object类、String类 多态

weixin_64646820的博客 2076

c# 如何使用S7NET 读取汇川H5U的数据

本文介绍了两种使用C#读取汇川H5U PLC数据的方法。第一种通过ModbusTCP协议(推荐),使用NModbus库实现,步骤包括配置PLC的Modbus服务器功能、安装库及编写读取保持寄存器的代码。第二种针对兼容西门子S7协议的型号,使用S7NetPlus库直接读取。文章强调需注意地址映射关系、协议配置及网络设置,并建议优先采用ModbusTCP方案以确保稳定性。两种方法均提供了完整的代码示例,帮助开发者快速实现在C#环境下与汇川H5U PLC的通信。

StevenChen的博客 457

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java 面向对象知识点深度整理与详解

抽象类是一种不能被实例化的类,它存在的意义是为子类提供一个通用的框架和规范。抽象类中可以包含抽象方法和具体方法,抽象方法是只有方法声明,没有方法体实现的方法,需要子类去具体实现;而具体方法则有完整的方法体,可以被子类直接继承使用。包是 Java 对类和接口进行组织管理的重要手段,类似于现实生活中的文件夹,用于将功能相关的类和接口集中存放。它不仅能避免命名冲突,还能实现访问控制,增强代码的可维护性和可扩展性。

2401_83465042的博客 948

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

一文读懂—面向对象

类是面向对象编程中的一个概念,指的是一类具有相同属性和行为的对象的抽象。类可以看作是一种模板或蓝图,描述了对象的属性和方法。通过定义一个类,可以创建多个具有相同属性和行为的对象。类由属性和方法构成,属性用于描述对象的特征,方法用于描述对象的行为。通过实例化类,可以创建对象,并对对象进行操作。类是面向对象编程中封装、继承和多态的基础。

2401_86120670的博客 1550

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

一文掌握JavaScript面向对象的知识点

这篇文章瑶琴带大家学习 javascript 中面向对象的内容,在学习面向对象前,了解面向对象的包含哪些知识点有利于在脑海中形成知识架构。以下是JS面向对象包含的主要知识点,在后续的文章中,瑶琴会带大家深入学习。

weixin_40348267的博客 602

教妹学Java(二十一):一文带你了解面向对象编程的所有概念

你好呀,我是沉默王二,是《Web 全栈开发进阶之路》的作者,优快云 的博客之星。《教妹学 Java》是一套非常有趣的付费专栏,除了继续保持幽默风趣的行风风格,我还力求把每一个知识点讲得透彻明白,保证你可以从中受益,成为一名优秀的 Java 工程师。本篇来谈一谈“面向对象编程”中的所有概念。 因为是第一次做付费专栏,所以有一定的压力,虽然只需要 9.9 元,但我对自己的要求是至少要达到 199 元...

沉默王二 4937

java面向对象学不会?看完这篇文章就会了

1.什么是面向对象 众所周知java是面向对象的编程语言,那么什么是面向对象呢,大家经常把面向对象和面向过程混淆,下面就说个例子,一秒就会! 例如小明有一些脏衣服需要去洗干净,这是就相当于一个命令把衣服洗干净 A:面向过程:小明需要自己独立完成,打水、放洗衣液、搓衣服等等一些列操作直至衣服洗干净 B:面向对象:小明不需要自己独立完成,但是他需要把衣服送到具有洗衣服功能的地方,例如洗衣房,你需要办一张会员卡,然后对工作人员说:我不管你用什么办法,总之给我洗干净就行 2.面向对象格式 首先需要一..

m0_62222133的博客 403

Java面向对象各个知识点的总结

Java面向对象各个知识点的总结前言补充一、面向对象编程概述二、类的成员1—成员变量三、类的成员2—方法5.1 方法介绍&理解5.2 方法的重载(overload)5.3 可变个数形参的方法5.4 方法的参数传递机制:值传递(重点、难点)5.5 递归方法四、类的成员3—构造器/构造方法五、类的成员4—代码块六、类的成员5—内部类七、面向对象特征1—封装八、面向对象特征2—继承extends8.1 继承性介绍8.2 方法重写8.3 Object超类九、面向对象特征3—多态(较难)十、关键字的使用。

weixin_44525733的博客 1481

【2025-2026】大疆嵌入式岗位笔试知识点整理最全(以及超详细知识点详解)及【去年真题】

【2025-2026】大疆嵌入式岗位笔试知识1、大疆嵌入式笔试采用线上笔试,分为单选、多选、填空、判断、编程。大疆自己做的网站,自己出题,所以,肯定会有很多历年考题的影子,一定多看网上的历年真题。5、我按照文中试题链接顺序,整理了真题中涉及到的知识点,150页左右PDF文件,方便复习查看,获取可看文章末尾。如下图所示,程序代码均放在了放在了表格内,方便复制到您的代码编辑器中,方便查看。2、其余部分考察基础知识,还是很细的,时间足够用,大概一小时全部写完;3、题型:单选、多选、判断(新增)、填空、简答、编程;

m0_46132568的博客 4012

Java面向对象程序设计知识点总结

Java面向对象程序设计是软件开发的关键基石。从基础概念到复杂特性,它涵盖丰富内容。无论是环境搭建、语法基础,还是面向对象的进阶知识、异常处理与常用类,都紧密相连。本文将对这些知识点进行系统总结。

m0_74843596的博客 1266

学不会面向对象的最大问题,你猜是什么?

静态变量 在定义一个类时,只是在描述某类事物的特征和行为,并没有产生具体的数据,只有通过new关键字实例对象后,系统才会为某个对象分配空间,存储各自的数据. 有时候,开发人员为了某些数据在 内存中只存在一份,例如:一个学校的学生他们都共享同一个学校名称,这时候就不必在每个对象所占的内存空间中都声明一个变量来表示学校名称,只需要在类的外部声明一个变量来让所有对象共享. 看一段程序: public class Test1 { public static void main(String[] args)

m0_51435111的博客 522

如果这篇文章你都看不懂~那么你应该是学不会Python了!

 Lesson 1 准备好学习Python的环境   下载的地址是:www.python.org   为了大家的方便,我在校内作了copy:   http://10.1.204.2/tool/compiler&IDE/Python-2.3.2-1.exe   linux版本的我就不说了,因为如果你能够使用linux并安装好说明你可以一切自己搞定的。运行环境可以是linux或者是wi...

爬遍所有网站 871
上一篇: Python实现简单的 “导弹” 自动追踪!
下一篇: Python中你所不知道的关于函数的秘密,原来函数这么简单
酸菜鱼编程
博客等级 码龄6年 155粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值