python学习日记3-面向对象

面向对象

++++++++++++++++++++++++++++++++++

总结目录:

一. 属性与方法
1. 类属性 @property
2. 实例属性
3. 类方法 @classmethod
4. 实例方法
5. 静态方法 @staticmethod
二. 模块 模块的引用与使用:
import xxx 引用xxx模块
import xxx as new_xxx 引用xxx模块,并以new_xxx为别名
from xxx import yyy 从xxx模块引用yyy 属性或者方法或者变量
from xxx import * 从xxx模块引用 所有的属性和方法和变量
from xxx import yyy as new_yyy 从xxx模块引用yyy 并以new_yyy为别名
三 . 列表推导式 :[ 表达式 for 变量 in 旧列表 if 条件]
四 .生成器:
创建方式:
第一种方法:把列表推导式的[] 修改().例如:(表达式 for 变量 in 旧列表 if 条件);
第二种方法为通过函数+ yield 的方式。
读取: 通过next(生成器实例) 的方式读取数据

1. 基础

类是type类型的一个对象

class Myclass():
    
    # 方法至少需要一个参数
    def speak(self):
        print('speak')


    pass
print(id(Myclass),type(Myclass))
# 140520792804736 <class 'type'>    类型为type

mc = Myclass()
print(id(mc),type(mc))
# 输出:4482600272 <class '__main__.Myclass'>  类型为Myclass
2.self 参数
  • 类内部的方法不能直接访问类内部的变量,只能通过“self.属性”的方式访问,并且self 在这里会被指代为类的具体实例。
class Myclass():
    name = '老高'
    # 方法至少需要一个参数,第一个参数指向为实力本身。
    def speak(self):
        print('%s speak'%self.name)
    pass

mc = Myclass()
mc.speak();

mc2 = Myclass()
mc2.name = '高子怡'
mc2.speak()
3. 类的特殊方法,使用开始 结束的函数,
  • 在类中的特殊方法,又称为魔术方法。
  • 一般是以__xx__() 形式出现的。
  • 特殊方法一般都是自动调用的,不需要手动调用的
class Person:
    print('sdsd') # 现执行print('sdsd') ,后执行__init__
    def __init__(self,name):
        print('init 执行')
        self.hidden_name = name
  • 其他常用的特殊方法:
    a > __repr__ 和 __str__ - 字符串表示形式
    __repr__ 用于提供给开发者查看的对象字符串表示,而 __str__ 用于提供给用户的对象字符串表示
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __repr__(self):
        return f'Point({self.x}, {self.y})'
    
    def __str__(self):
        return f'({self.x}, {self.y})'

point = Point(3, 4)
print(repr(point))  # 输出结果为 'Point(3, 4)'
print(str(point))   # 输出结果为 '(3, 4)'

b > __len__ 获取对象长度
定义对象的长度,使其支持内置函数 len()

class CustomList:
    def __init__(self, items):
        self.items = items
    
    def __len__(self):
        return len(self.items)

my_list = CustomList([1, 2, 3, 4, 5])
print(len(my_list))  # 输出结果为 5

c > __eq__ 比较相等性
定义对象之间的相等性比较

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author
    
    def __eq__(self, other):
        return self.title == other.title and self.author == other.author

book1 = Book('Python', 'Guido')
book2 = Book('Python', 'Guido')
print(book1 == book2)  # 输出结果为 True

d > __iter__ 和 __next__ 迭代器
实现对象的迭代器协议,用于迭代对象。

class Countdown:
    def __init__(self, start):
        self.start = start
    
    def __iter__(self):
        self.current = self.start
        return self
    
    def __next__(self):
        if self.current <= 0:
            raise StopIteration
          # raise 手动触发异常的关键字
          #StopIteration一个内置异常类,通常与迭代器(iterator)和生成器(generator)一起使用。在迭代过程中,当没有更多的元素可供迭代时,Python 的迭代器会引发 StopIteration 异常来通知迭代结束
        else:
            result = self.current
            self.current -= 1
            return result

countdown = Countdown(5)
for num in countdown:
    print(num)  # 输出倒数 5, 4, 3, 2, 1

4. 类的封装
  • 需要封装的原因:增强数据的安全性,不能使其随便的更改。
  • 封装是指隐藏类中的一些不希望被外部访问的属性和方法。
  • 封装的属性一般通过getter() 和setter()的方式对其进行访问和修改
  • 隐藏属性真正的方式:一般是需要使用xxx 双下划线的方式,使用双下划线后,python默认会修改属性的名字,使其在外部访问不到。***修改规则为:类名_属性名***
  • 但在实际应用中,我们一般使用单下划线_xx的方式定义私有属性
class Person:
    def __init__(self,name,age):
        self.__name = name
        # 在实际应用中,一般使用这种方式保持私有属性。其目的在于告知其他开发者,这是一个私有属性
        self._age = age

    def get_name(self):
        return self.__name

    def set_name(self,name):
        self.__name = name
    def sperk(self):
        print("我的名字叫: %s"%self.get_name())
  
    # 
    # age属性的getter和setter 存取器
    def get_age(self):
        return self._age

    def set_age(self, age):
        self._age = age


p = Person('laogao')
p.sperk()


print(p._Person__name)
# 输出为:laogao。也就是说在使用__xxx 双下划线的方式隐藏属性时,其实质是:python将其属性名称修改为了_类名__属性名***,即_Person__name

5. property 装饰器

@property装饰器 : 我们可以使用@property装饰器来创建只读属性

@property 装饰器原理:会将方法转化为相同名称的只读属性。可以与所定义的属性配合使用,这样可以有效的防止属性被修改。

class Person:
    def __init__(self,name,age):
        self._name = name
        self._age = age

    #@property 将方法转化为相同名称的只读属性
    @property
    def name(self):
        return self._name

    #这是一个setter方法,setter方法的装饰器格式为:@属性名.setter
    # 一般很少使用
    @name.setter
    def name(self,name):
        self._name = name


p = Person('laogao', 40)
p.name = '你哈'
print(p.name)

@classmethod 装饰器,可以是类中的方法直接变成为类方法,而非实例方法。
实例方法与类方法的转换:p.test() 与Person.test(p) 是一样的.

class Person():
    total = 0
    def __init__(self,name):
        # 注意类属性的时候,需要赋值给 Person.属性
        Person.total += 1
  
    # classmethod 可以是方法变为类方法,可以直接使用类名调用改方法
    @classmethod
    def getTotal(self):
        print('当前一共 %s 个人'%self.total)
        return
    # 实例方法
    def test(self):
        print('实例方法test')

p = Person('laogao')
p2 = Person('gaotui')

# 该处是 使用的类的方法 直接调用的
Person.getTotal()
#输出 当前一共 2 个人

#其实我尝试了一下,使用实例也是可以调用的
p2.getTotal()
#输出 当前一共 2 个人

# 实例方法与类方法的转换
p.test() 与Person.test(p) 是一样的。

@staticmethod 用于定义静态方法的装饰器
静态方法是类中的一个方法,与类和实例无关,它不会自动传递类或实例作为第一个参数。静态方法在逻辑上属于类,但在定义时不需要指定 self 或 cls 参数。
一般用于做一些工具类使用比较多。

class MathOperations:
    @staticmethod
    def add(a, b):
        return a + b

    @staticmethod
    def multiply(a, b):
        return a * b

# 通过类直接调用静态方法
print(MathOperations.add(5, 3))       # 输出结果为 8
print(MathOperations.multiply(5, 3))  # 输出结果为 15

# 通过类的实例调用静态方法
math = MathOperations()
print(math.add(2, 2))       # 输出结果为 4
print(math.multiply(2, 2))  # 输出结果为 4

6. 继承与多重继承
  • 使用继承的方式,提高类的复用性(基类,超类)
  • super()获取当前类的父类,调用是不需要self参数
  • 多重继承:是指一个子类可以继承多个父类的属性和方法。
    方式为: 在类名的()内添加多个父类,多父类中同名的方法,按照第一父类,第二父类依次向上寻找。前面的覆盖后面的

    但是 python接收多重继承。 一般很少使用,使用时会程序更加复杂化。

class A:
    def some_method(self):
        print("Method from class A")
# 继承,
class B(A):
     def __init__(self,name,age):
        # super()获取当前类的父类,调用是不需要self参数
        super().__init__(name)
        self._age = age
    def some_method(self):
        super().some_method()  # 调用 A 类的 some_method()
        print("Method from class B")

class C(A):
    def some_method(self):
        print("Method from class C")

# 多重继承
class D(B, C):
    def some_method(self):
        super(B,self).some_method()  # 调用 B 类的 some_method()
        print("Method from class D")
6. 多态 即多种形态

譬如:内置方法len(),就是多态。不管输入的是list类型还是字符串类型。都可以输出正确的长度。

lst = [1,2,3]
print(len(lst))
# 输出:2
str = 'python'
print(len(str))
# 输出:6
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容