python面向对象-学习笔记(二、类&对象的属性)

发布时间 2023-10-29 15:28:36作者: 阿慢2010

如何定义一个类?

创建类的格式
class 类名:
	pass

怎么通过类,创建出一个对象?

创建类,并实例化对象
class Money:
    pass

one = Money()
# 打印类
print(Money)
# 打印类的实例
print(one)

image

类的别名和打印类的名称
class Money:
    pass
# 打印类的名称
print(Money.__name__)
# 类的别名
xxx = Money
print(xxx.__name__)

image

类名也是变量名
class Money:
    pass


# Money既是类名也是变量名
Money = 666
print(Money)

image

对象指向的类
class Money:
    pass


one = Money()
# 对象指向的类
print(one.__class__)

image

属性相关

属性和变量的区别及判定依据?

  1. 区别
    • 概念
    1. 变量是“可以改变的量值”
    2. 属性是“属于某个对象的特性”
    • 访问权限
    1. 变量:根据不同的位置,存在不同的访问权限(全局变量,局部变量...)
    2. 属性:只能通过对象来进行访问
  2. 判断依据:是否存在宿主

对象属性

给对象增加属性(一)
class Person:
    pass


# 2.根据类,创建一个对象
p = Person()

# 3.给person对象,增加一些属性
p.age = 18
p.height = 180

# 4.验证属性是否添加成功
print(p.age)
# 系统自带的所有属性和方法字典
print(p.__dict__)

image

对象修改属性(一)
class Person:
    pass


# 属性修改
p = Person()
p.age = 18
print(p.age)
p.age = 100
print(p.age)

image

对象修改属性(二)可迭代属性
class Person:
    pass


# 2.根据类,创建一个对象
p = Person()

# 5.1 属性修改(p.pets地址未变)
p.pets = ['小花', "小黑"]
print(p.pets, id(p.pets))
p.pets.append('小黄')
print(p.pets, id(p.pets))
# 5.2 属性修改(p.pets地址变了)
p.pets = [1, 2]
print(p.pets, id(p.pets))

image

一般情况下,属性存储在__dict__的字典中的(有些内置对象没有__dict__属性?) 一般的对象可以修改__dict__属性 对象增加/修改/删除属性(另类)
class Money:
    pass


# 另一种方式添加对象的属性
one = Money()
one.__dict__ = {"name": "张三"}
print(one.name)
one.__dict__["name"] = "李四"
print(one.name)
one.__dict__ = {}
print(one.__dict__)

image

对象删除属性
class Person:
    pass


# 删除对象的属性
p = Person()
p.age = 18
del p.age
print(p.age)

image

不同对象之间能否访问对方的属性
class Person:
    pass


# 2.根据类,创建一个对象
# p = Person()

p1 = Person()
p2 = Person()
p1.age = 18
p2.address = "上海"
# p1能访问p2的属性吗?
print(p1.address)

image

类属性

类属性的增、改、查、删
class Money:
    pass


# 类属性的增、改、查、删
Money.count = 1
print(Money.count)
print(Money.__dict__)
Money.count = 10
print(Money.count)
del Money.count
print(Money.count)

image

类属性的增加方式(二)常用方式
class Money:
    count = 1
    age = 18
    number = 666


print(Money.count)
print(Money.age)
print(Money.number)
print(Money.__dict__)

image

为什么可以通过对象访问类的属性? 和Python对象的属性查找机制有关。 优先到对象自身去查找属性,找到就结束;如果没有找到,则根据__class__找到对应的类,到这个类中查找 通过对象查询类的属性
class Money:
    count = 1
    age = 18
    number = 666


one = Money()
print(one.count)
print(one.age)
print(one.number)

image

修改对象的指向
class Test:
    sex = "男"


class Money:
    count = 1
    age = 18
    number = 666


one = Money()
# 通过修改该值,修改类的指向
one.__class__ = Test

print(one.sex)
print(one.age)

image

当对象和类中都有相同属性时,通过对象访问的是对象自身的属性
class Test:
    sex = "男"


one = Test()
one.sex = "女"

print(one.sex)

image

类中的属性,无法通过对象来修改
class Money:
    count = 1
    age = 18
    number = 666


one = Money()
print(Money.age)
one.age = 19
print(one.__dict__)
print(Money.age)
类中的属性,无法通过对象来删除
class Money:
    count = 1
    age = 18
    number = 666


one = Money()
del one.age

image

类中的__dict__只读,无法修改
class Money:
    count = 1
    age = 18
    number = 666
    pass

Money.__dict__={"name":"sz"}
print(Money.name)

image

类中的__dict__只读,无法修改(二)
class Money:
    count = 1
    age = 18
    number = 666
    pass


Money.__dict__["sex"] = "男"
print(Money.sex)

image

类的属性被所有对象共享
class Money:
    age = 18


one = Money()
two = Money()

print(one.age)
print(two.age)

Money.age = 20
print(one.age)
print(two.age)

image

对象属性和类属性之间的区别和联系?

对象中添加与类中相同的属性并赋值(一)
class Person:
    age = 10


p = Person()

# 添加对象的属性
p.age += 5
# 上面语句相当于 p.age = p.age +5 =15
print(Person.age)  # 10
print(p.age)  # 15

image

高级

限定对象中的属性__slots__
class Person:
    # 限定对象中的属性(类中不允许出现__slots__中包含的属性)
    __slots__ = ["age"]
    # age = 15 # 如下图一
    num = 110
    pass


print(Person.num)
p1 = Person()
p1.age = 10
p1.num = 2

print(p1.age)
print(p1.num)

image

image


学习链接: 【Python】零基础入门 面向对象编程(强烈推荐)