小结-Python-关于OOP的类、对象、属性、方法的测试

以下代码运行前,可以思考输出是什么,对比真实输出,查漏补缺。

关于类的私有方法和私有属性

'''
类的私有方法和私有属性,不能被类的实例对象直接访问!
'''
class Person(object):
    name = "Andrew"

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

    def eat(self):
        print("The Person %s is eating" % self.name)

    def __personOnly(self):
        print("外部访问内部私有方法(__personOnly)需要对象名+类名+方法才能访问")

    def innerInvoke(self):
        Person.__personOnly(self)
        print("但是如果类的内部方法(innerInvoke)访问私有方法(__personOnly)简单许多")


p = Person("Parker")
print(p.name)
p.eat()
print("<--------------------------->")
# 可见,Python中类的私有方法不能直接被外部类的实例对象访问
# 需要 "对象名._类名__xxx" 才能访问。不过一般用于类的内部访问。
p._Person__personOnly()
print(Person.name)
print("<--------------------------->")
p.innerInvoke()



# Output 
Parker
The Person Parker is eating
<--------------------------->
外部访问内部私有方法(__personOnly)需要对象名+类名+方法才能访问
Andrew
<--------------------------->
外部访问内部私有方法(__personOnly)需要对象名+类名+方法才能访问
但是如果类的内部方法(innerInvoke)访问私有方法(__personOnly)简单许多


关于属性和方法的使用

'''
方法可以借助修饰器实现属性化,直接通过类似于属性访问和修改方式访问方法。
'''


class User:
    def __init__(self, name):
        self.__name = name

    def getname(self):
        return self.__name

    def setname(self, name):
        self.__name = name

    name = property(getname, setname)


u = User("Parker")
print(u.name)

u.name = "Andrew"
print(u.name)

u.age = 21
print(u.age)
u.__age = 22
print(u.__age)

# Output 
Parker
Andrew
21
22

关于类的多继承和顺序问题

'''
关于类的继承,子类要么直接重新构造init函数,或者只能继承一个多父类的一个父类构造函数
并且,依据顺序继承。
'''


class Employee:
    def __init__(self, salary):
        self.salary = salary

    def work(self):
        print("salary is %d" % self.salary)


class Customer:
    def __init__(self, salary, job):
        self.salary = salary
        self.job = job

    def info(self):
        print("the salary is %d and the job is %s" % self.salary, self.job)


# 这样显然是优先继承父类Employee的构造方法(在没有自己初始化init函数)
class Manager(Employee, Customer):
    pass


m = Manager(5000)
m.work()
# 由于继承顺序原因,所以只接受两个参数,self和salary;
# 因此会报错输出!
m1 = Manager(5000, "teacher")
m1.info()

# Output
salary is 5000
Traceback (most recent call last):
  File "/Users/Parker/PycharmProjects/Python/Test/OOP/test3.py", line 32, in <module>
    m1 = Manager(5000, "teacher")
TypeError: __init__() takes 2 positional arguments but 3 were given

关于特殊方法的运用

'''
特殊方法如:__init__ __str__ __del__ 不同于私有方法 __name __age;
'''


class User:
    def __init__(self, name, salary):
        self.__name = name
        self.__salary = salary

    def __str__(self):
        return self.name + " has a salary of " + str(self.salary)

    def __del__(self):
        print("一旦重写__del__析构方法,则Python将把内存管理交给程序员;否则自动调用其方法")
        print("注意:这个特殊方法在程序结束后自动调用!")
        print("auto del")

    # 方法属性化方法一,注意函数命名相同,但是修饰器的修饰不同!
    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name

    @name.getter
    def name(self):
        return self.__name

    # 方法属性化方法二,这个比较一目了然。只需要给property一个setter和getter函数就可以
    def get_salary(self):
        return self.__salary

    def set_salary(self, salary):
        self.__salary = salary

    salary = property(get_salary, set_salary)


# 初始化,调用特殊方法init
u = User("Andrew", 5000)
# 调用方法属性化方式访问修改name
print(u.name)
u.name = "Parker"
# 调用方法属性化方式去修改salary
print(u.salary)
u.salary = 9000
# 调用特殊方法str,输出!程序结束后,自动调用特殊方法del
print(u)

# Output 
Andrew
5000
Parker has a salary of 9000
一旦重写__del__析构方法,则Python将把内存管理交给程序员;否则自动调用其方法
注意:这个特殊方法在程序结束后自动调用!
auto del


小结

针对于OOP,也就是Python的面向对象编程来说,有和Java类似之处,但上面列出的几个例子都是相比较于java,Python的面向对象编程的特性!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容