类的定义
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
类与类之间的关系
大千世界, 万物之间皆有规则和规律. 我们的类和对象是对大千世界中的所有事物进行归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在面向对象的世界中. 类与类中存在以下关系:
- 依赖关系,狗和主人的关系
- 关联关系,你和你的女盆友的关系就是关联关系
- 组合关系,比聚合还要紧密.比如人的大脑, 心脏, 各个器官. 这些器官组合成一个人. 这时. 人如果挂了. 其他的东西也跟着挂了
- 聚合关系,电脑的各部件组成完整的电脑,电脑里有CPU, 硬盘, 内存等。 每个组件有自己的生命周期, 电脑挂了. CPU还是好的. 还是完整的个体
- 继承关系, 类的三大特性之一,子承父业
关联关系
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 分手了