python基础 -27- 面向对象(类的定义,属性,类之间的关系)

类的定义

class Dog:  # 类名首字母要大写,驼峰体
    d_type = "京巴"  # 公共属性,又称类变量
    
    def say_hi(self):  # 类的方法,必须带一个self参数,代表实例本身,具体先不解释
        print("hello , I am a dog,my type is ",self.d_type) # 想调用类里的属性,都要加上self., 原因先不表

        d = Dog()  # 生成一个狗的实例
d2 = Dog()  # 生成一个狗的实例

d.say_hi()  # 调用狗这个类的方法
d2.say_hi()

print(d.d_type)  # 调用Dog类的公共属性

 以上代码就是定义好了Dog这个类,相当于先生成了一个模板,接下来生成了2个实例d, d2,相当于2条有血有肉的狗被创造出来了。

 d_type是类变量,是Dog类下所有实例共有的属性,它存在Dog类本身的内存里。你可以查看d1.d_type,d2.d_type的内存地址,指向的是同一处

 除了共有属性,有没有私有(这里的私有指的就是实例属性)的呢? 比如每条狗的名字、年龄、主人都不一样。可以的,如下操作就行:

class Dog:
    d_type = "京巴"
    d_name = "小黑"

    # 构造方法
    def __init__(self, age, d_type="京巴", name="小黑"):
        print("---构造方法---")
        self.d_type = d_type
        self.d_name = name
        self.age = age

    def say_hi(self):
        print("hello,i am a dog,my type is", self.d_type, ",my name is", Dog.d_name, "my age is", self.age)


dog = Dog(5)
dog2 = Dog(2, "藏獒", "小白")

dog.say_hi()
dog2.say_hi()

print("---修改类属性---")
Dog.d_type = "哈巴"   # 改的是类属性
Dog.d_name = "小白黑"
dog.say_hi()
dog2.say_hi()

# 测试类属性和实例属性
print(Dog.d_type)
print(dog.age)
print(Dog.age)

 输出

age是实例的属性,type是类属性


self就是代表实例本身。你实例化时python会自动把这个实例本身通过self参数传进去。

相当于c++,java,js中的this


私有属性

 在属性的前方加个__就可以将属性变为私有的

class Dog:
    __name = "你好呀"

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

    def say_hi(self):
        print(Dog.__name, self.__age)


dog = Dog(6)
dog.say_hi()

# 调用私有属性
print(dog.__age)
print(dog.__name)

 输出

不论是类属性,还是实例属性,只要是私有的,都只能在类内部进行调用,外部无法访问


私有属性真的不能访问吗,其实是可以的

print(dog._Dog__age)
print(dog._Dog__name)
dog._Dog__age = 10
print(dog._Dog__age)

 输出

6
你好呀
10


类与类之间的关系

大千世界, 万物之间皆有规则和规律. 我们的类和对象是对大千世界中的所有事物进行归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在面向对象的世界中. 类与类中存在以下关系:

  1. 依赖关系,狗和主人的关系
  2. 关联关系,你和你的女盆友的关系就是关联关系
  3. 组合关系,比聚合还要紧密.比如人的大脑, 心脏, 各个器官. 这些器官组合成一个人. 这时. 人如果挂了. 其他的东西也跟着挂了
  4. 聚合关系,电脑的各部件组成完整的电脑,电脑里有CPU, 硬盘, 内存等。 每个组件有自己的生命周期, 电脑挂了. CPU还是好的. 还是完整的个体
  5. 继承关系, 类的三大特性之一,子承父业

关联关系

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

    def do_private_stuff(self):
        pass

p1 = Person("drake", 25, "M")
p2 = Person("taylor", 24, "F")

p1.parter = p2
p2.parter = p1


print(p1.parter.name, p2.parter.name)

 输出

taylor drake

 可以创建个单独的类,存储2个人的关系状态,2个人在查自己的感情状态时,都到这个单独的实例里来查

class RelationShip:

    def make_couple(self, obj1, obj2):
        self.couple = [obj1, obj2]
        print("[%s] 和 [%s] 确定了男女关系..." % (obj1, obj2))

    def get_my_partner(self, obj):
        for person in self.couple:
            if person != obj:
                return person

    def break_up(self):
        print(self.couple[0].name, "和", self.couple[1].name, "分手了")
        self.couple.clear()


class Person:
    def __init__(self, name, age, sex, relation=None):
        self.name = name
        self.age = age
        self.sex = sex
        self.relation = relation  # 存储两人的关系对象

    def do_private_stuff(self):
        pass




relation = RelationShip()
p1 = Person("drake", 25, "M", relation)
p2 = Person("taylor", 24, "F", relation)

# 谈对象
relation.make_couple(p1, p2)

print(p1.name, "的对象:", p1.relation.get_my_partner(p1).name)
print(p2.name, "的对象:", p2.relation.get_my_partner(p2).name)

# 分手
p1.relation.break_up()

 输出

[<__main__.Person object at 0x000002AF7B375C10>][<__main__.Person object at 0x000002AF7B3E7880>] 确定了男女关系...
drake 的对象: taylor
taylor 的对象: drake
drake 和 taylor 分手了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值